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

news/2024/11/18 3:43:59/

动态切换数据库链接

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

前置条件

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

Flask

使用 Flask-SQLAlchemy 创建 model

# 使用 Flask-SQLAlchemy 创建 model from flask_sqlalchemy import SQLAlchemydb = 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 的文件,并添加以下内容:
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 Nonedef 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 Nonedef allow_relation(self, obj1, obj2, **hints):# 允许关系操作return Truedef allow_migrate(self, db, app_label, model_name=None, **hints):# 允许迁移操作return True
  1. 在 settings.py 文件中配置数据库路由:
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
  1. 查询

# 方式一
UserExtend._meta.app_label = "AppExtendDB"
UserExtend.objects.all()# 方式二
UserExtend.objects.using('AppExtendDB').all()

到此结  DragonFangQy 2023.10.31


http://www.ppmy.cn/news/1188866.html

相关文章

write、fwrite、fstream二进制I/O的效率对比

测试数据 写文件测试数据 注:每项数据为3次运行的结果取平局值,运行时长为10ms。 单次传入字节数(B)写入字节数(MB)writefwritefstream.write10.005 0.124 0.127 40.019 0.453 0.450 160.064 1.840 1.860 640.363 4.503 4.277 …

什么是 DevOps

DevOps是一套融合软件开发(Dev)和 IT 运营(Ops)的实践,旨在缩短应用程序开发周期并确保以高软件质量持续交付,通过采用 DevOps 实践,您可以帮助组织更可靠、更快速、更高效地交付软件。 什么是…

高效改名,文件夹名称替换:一键批量替换文件夹名中间部分内容

在我们的日常生活和工作中,经常需要处理大量的文件夹,其中有些文件夹名称可能包含我们需要替换的内容。但如果我们一个一个地手动修改文件夹名称,不仅耗时而且容易出错。为了解决这个问题,我们可以使用云炫文件管理器高效的文件夹…

罢工效应,韩电池业在美建厂面临挑战 | 百能云芯

美国汽车行业的罢工事件仍在持续,对于远在数千公里之外的韩国电池制造商来说,这引发了不小的担忧,他们担心生产成本会因此大幅上升。 据彭博资讯报道,韩国电池制造商LG新能源、SK On和三星SDI,已与美国的三家汽车制造巨…

Pod资源限制与探针

目录 资源限制 资源限制概述 资源单位 示例 示例1 示例2 探针 探针的三种规则 Probe支持三种检查方法 示例 示例1:exec方式 示例2:httpGet方式 示例3:tcpSocket方式 示例4:就绪检测 示例5:就绪检测2 …

AcWing第 127 场周赛 - AcWing 5283. 牛棚入住+AcWing 5284. 构造矩阵 - 模拟+快速幂+数学

AcWing 5283. 牛棚入住 题目数据范围不大&#xff0c;直接暴力模拟即可 按照题目所说的意思即可。 #include <math.h> #include <stdio.h> #include <algorithm> #include <cstring> #include <iostream> using namespace std; const int N 1…

计算机毕业设计选题推荐-社区志愿者服务微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

末日危机小说,情节紧凑刺激,主角霸气拯救世界,绝对过瘾

今天小郑为大家精挑细选了三本让人欲罢不能的末日危机小说。这些书籍不仅在情节设计上扣人心弦&#xff0c;更在设定和人物塑造上别具一格。每一本都犹如一部惊心动魄的探险旅程&#xff0c;让你在享受阅读的乐趣的同时&#xff0c;也能感受到深刻的思考和震撼。 《全世界只有…