Flask-SQLAlchemy 中使用显式主主数据库设置

在这里插入图片描述

1、问题背景

在一个 Flask-SQLAlchemy 项目中,用户想要使用显式主主数据库设置。具体而言,他想要能够从默认数据库中读取数据,并将数据持久化到两个主数据库中。他希望知道是否可以使用 Flask-SQLAlchemy 和 binds 来实现这一目标。

2、解决方案

为了实现显式主主数据库设置,可以按照以下步骤进行操作:

  1. 定义 SQLAlchemy 应用程序配置
app = Flask(__name__)

# 定义默认数据库 URI
SQLALCHEMY_DATABASE_URI = 'default_DB_uri'

# 定义主数据库 URI
SQLALCHEMY_BINDS = { 'master1':'first_master_DB_uri', 'master2': 'second_master_DB_uri' }

# 将 SQLAlchemy 配置应用到 Flask 应用中
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_BINDS'] = SQLALCHEMY_BINDS

# 创建 SQLAlchemy 对象
db = SQLAlchemy(app)
  1. 自定义 Flask-SQLAlchemy 会话类
from flask_sqlalchemy import SQLAlchemy, SignallingSession, get_state
from flask_sqlalchemy._compat import itervalues

class UsingBindSignallingSession(SignallingSession):
    def get_bind(self, mapper=None, clause=None):
        if self._name:
            _eng = get_state(self.app).db.get_engine(self.app,bind=self._name)
            return _eng
        else:
            return super(UsingBindSignallingSession, self).get_bind(mapper, clause)

    _name = None
    def using_bind(self, name):
        self._name = name
        return self

class UsingBindSQLAlchemy(SQLAlchemy):
    def create_session(self, options):
        return UsingBindSignallingSession(self, **options)

    def get_binds(self, app=None):
        retval = super(UsingBindSQLAlchemy, self).get_binds(app)
        # get the binds for None again in order to make sure that it is the default bind for tables
        # without an explicit bind
        bind = None
        engine = self.get_engine(app, bind)
        tables = self.get_tables_for_bind(bind)
        retval.update(dict((table, engine) for table in tables))
        return retval

    def get_tables_for_bind(self, bind=None):
        """Returns a list of all tables relevant for a bind.
        Tables without an explicit __bind_key__ will be bound to all binds.
        """
        result = []
        for table in itervalues(self.Model.metadata.tables):
            # if we don't have an explicit __bind_key__ bind this table to all databases
            if table.info.get('bind_key') == bind or table.info.get('bind_key') == None:
                result.append(table)
        return result

db = UsingBindSQLAlchemy()
  1. 使用自定义的 Flask-SQLAlchemy 会话类
# 创建一个默认数据库会话
session = db.session

# 创建一个主数据库会话
master_session1 = db.session().using_bind('master1')

# 创建另一个主数据库会话
master_session2 = db.session().using_bind('master2')

# 在默认数据库中读取数据
read_data = session.query('select ...').all()

# 在第一个主数据库中持久化数据
master_session1.add(SOME_OBJECT)
master_session1.commit()

# 在第二个主数据库中持久化数据
master_session2.add(SOME_OBJECT_CLONE)
master_session2.commit()

通过上述步骤,就可以实现显式主主数据库设置,并在 Flask-SQLAlchemy 中使用它。

相关推荐

  1. Flask 系统教程 7】数据库使用 SQLAlchemy

    2024-04-23 10:44:03       8 阅读
  2. 数据库使用键回填

    2024-04-23 10:44:03       30 阅读
  3. SQL键回

    2024-04-23 10:44:03       5 阅读
  4. Flask-SQLAlchemy使用【一】

    2024-04-23 10:44:03       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 10:44:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 10:44:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 10:44:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 10:44:03       18 阅读

热门阅读

  1. 【无标题】

    2024-04-23 10:44:03       12 阅读
  2. SQL Server 中的 dbo:正确调用表的方法与实践

    2024-04-23 10:44:03       11 阅读
  3. 图搜索算法详解

    2024-04-23 10:44:03       13 阅读
  4. 深入了解 Spring Boot 的加载过程

    2024-04-23 10:44:03       14 阅读
  5. 面试经典150题——加油站

    2024-04-23 10:44:03       9 阅读
  6. RabbitMQ:消息队列的卓越之选

    2024-04-23 10:44:03       10 阅读
  7. kubernetes中的静态POD

    2024-04-23 10:44:03       21 阅读
  8. kitti2bag,py 报错

    2024-04-23 10:44:03       17 阅读
  9. P8739 [蓝桥杯 2020 国 C] 重复字符串

    2024-04-23 10:44:03       15 阅读
  10. hive通过正则过滤其他字段

    2024-04-23 10:44:03       17 阅读
  11. 数学分析复习:洛必达法则、泰勒公式

    2024-04-23 10:44:03       15 阅读
  12. AntD上传文件 结合Axios 服务端由Spring MVC接收

    2024-04-23 10:44:03       13 阅读
  13. Hive第二篇HQL

    2024-04-23 10:44:03       16 阅读