随记-动态切换数据库链接

动态切换数据库链接

如果你有多个数据库链接,并且在启动服务之前没有写入相关的配置文件,这种情况下该如何使用动态的增加数据库链接并使用呢?

前置条件

这里假设你的数据库配置信息已经写入默认的数据库中(这里暂且称为应用程序数据库,或者AppDB),在AppDB 中的某张表中存储着其他的数据库链接信息(这里暂且称为应用程序扩展数据库,或者AppExtendDB)

Flask

使用 Flask-SQLAlchemy 创建 model

python 复制代码
# 使用 Flask-SQLAlchemy 创建 model 

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

# 查询所有用户,使用 AppDB 的数据库链接
User.query.all()

def new_session(url):
	engine = create_engine(url)
    # 创建一个新的会话
    Session = sessionmaker(bind=engine)    
    return Session

# 创建一个 AppExtendDB 的数据库链接
db_new_session= new_session(url)()
# 查询 AppExtendDB 中的 user 信息,其他诸如表/列必须存在的基本要求不做赘述
User.query.with_session(bb).all()

# 类似的只有 AppExtendDB 中存在 UserExtend
# 所以 UserExtend.query.all() 就会报错
# 必须使用 UserExtend.query.with_session(bb).all()
class UserExtend(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    age= db.Column(db.String(80), unique=True, nullable=False)
    phone= db.Column(db.String(120), unique=True, nullable=False)

Django

使用 DatabaseRouter

  1. 创建一个数据库路由类,用于根据需要切换数据库连接。在你的应用程序中创建一个名为 database_router.py 的文件,并添加以下内容:
python 复制代码
class DatabaseRouter:
    def db_for_read(self, model, **hints):
        # 根据需要返回读取操作的数据库别名
        if model._meta.app_label == 'AppDB':
            return 'AppDB url'
        if model._meta.app_label == 'AppExtendDB':
            return 'AppExtendDB url'
        return None

    def db_for_write(self, model, **hints):
        # 根据需要返回读取操作的数据库别名
        if model._meta.app_label == 'AppDB':
            return 'AppDB url'
        if model._meta.app_label == 'AppExtendDB':
            return 'AppExtendDB url'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        # 允许关系操作
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # 允许迁移操作
        return True
  1. settings.py 文件中配置数据库路由:
python 复制代码
DATABASE_ROUTERS = ['your_app.database_router.DatabaseRouter']
  1. 修改你的代码,比如在中间件中

    复制代码
     def process_view(request, view_func, view_args, view_kwargs):
    
         default_dict = copy.deepcopy(settings.DATABASES['default'])
         default_dict.update({
             'ENGINE': 'django.db.backends.postgresql',
             'NAME': 'db name',
             'USER': 'db user',
             'PASSWORD': 'db pwd',
             'HOST': 'db host',
             'PORT': '5432',
         })
     settings.DATABASES['AppExtendDB'] = default_dict
  2. 查询

    方式一

    UserExtend._meta.app_label = "AppExtendDB"
    UserExtend.objects.all()

    方式二

    UserExtend.objects.using('AppExtendDB').all()


到此结  DragonFangQy 2023.10.31

相关推荐
周周记笔记15 分钟前
学习笔记:Python的起源
开发语言·python
魂尾ac40 分钟前
Django + Vue3 前后端分离技术实现自动化测试平台从零到有系列 <第一章> 之 注册登录实现
后端·python·django·vue
Source.Liu1 小时前
【Pywinauto库】10.7 pywinauto.controls.uia_controls控件
windows·python·自动化
人工干智能1 小时前
建自己的Python项目仓库,使用工具:GitHub(远程仓库)、GitHub Desktop(版本控制工具)、VSCode(代码编辑器)
python·编辑器·github
StarPrayers.1 小时前
PySpark基础知识(python)
python·数据分析·spark
emma羊羊1 小时前
【SQL注入】延时盲注
数据库·sql·网络安全
一叶飘零_sweeeet2 小时前
从 MySQL 到 TiDB:分布式数据库的无缝迁移与实战指南
数据库·mysql·tidb
潜龙95272 小时前
第6.2节 Android Agent开发<二>
android·python·覆盖率数据
axban2 小时前
QT M/V架构开发实战:QStandardItemModel介绍
开发语言·数据库·qt
没学上了2 小时前
数据库建立库-Qt
数据库