如何在Flask Sqlalchemy中分离Master Slave(DB读/写)

2023-12-25

我正在尝试通过 Flask Sqlalchemy 分离读取和写入数据库操作。我正在使用绑定来连接到 mysql 数据库。我想在主机中执行写入操作并从从机中读取操作。似乎没有内置的方法来处理这个问题。

我是Python新手,很惊讶像这样急需的功能还没有预先内置到flask-sqlalchemy中。任何帮助表示赞赏。谢谢


没有官方支持,但是可以自定义 Flask-SQLalchemy 会话来使用 master-slave 连接

from functools import partial

from sqlalchemy import orm
from flask import current_app
from flask_sqlalchemy import SQLAlchemy, get_state


class RoutingSession(orm.Session):
    def __init__(self, db, autocommit=False, autoflush=True, **options):
        self.app = db.get_app()
        self.db = db
        self._bind_name = None
        orm.Session.__init__(
            self, autocommit=autocommit, autoflush=autoflush,
            bind=db.engine,
            binds=db.get_binds(self.app),
            **options,
        )

    def get_bind(self, mapper=None, clause=None):
        try:
            state = get_state(self.app)
        except (AssertionError, AttributeError, TypeError) as err:
            current_app.logger.info(
                'cant get configuration. default bind. Error:' + err)
            return orm.Session.get_bind(self, mapper, clause)

        # If there are no binds configured, use default SQLALCHEMY_DATABASE_URI
        if not state or not self.app.config['SQLALCHEMY_BINDS']:
            return orm.Session.get_bind(self, mapper, clause)

        # if want to user exact bind
        if self._bind_name:
            return state.db.get_engine(self.app, bind=self._bind_name)
        else:
            # if no bind is used connect to default
            return orm.Session.get_bind(self, mapper, clause)

    def using_bind(self, name):
        bind_session = RoutingSession(self.db)
        vars(bind_session).update(vars(self))
        bind_session._bind_name = name
        return bind_session


class RouteSQLAlchemy(SQLAlchemy):
    def __init__(self, *args, **kwargs):
        SQLAlchemy.__init__(self, *args, **kwargs)
        self.session.using_bind = lambda s: self.session().using_bind(s)

    def create_scoped_session(self, options=None):
        if options is None:
            options = {}
        scopefunc = options.pop('scopefunc', None)
        return orm.scoped_session(
            partial(RoutingSession, self, **options),
            scopefunc=scopefunc,
        )

比默认会话将是master,当你想从slave中选择时可以直接调用它,这里是例子:

在您的应用程序中:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///master'
app.config['SQLALCHEMY_BINDS'] = {
    'slave': 'postgresql:///slave'
}

db = RouteSQLAlchemy(app)

从主控中选择

session.query(User).filter_by(id=1).first() 

从从机中选择

session.using_bind('slave').query(User).filter_by(id=1).first() 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Flask Sqlalchemy中分离Master Slave(DB读/写) 的相关文章

随机推荐

  • 在Scheme(Fluent)中运行(do ...)内的代码与循环外的执行方式不同

    我的续集上一个问题 https stackoverflow com q 58906949 12388640 我正在使用 ANSYS Fluent 程序进行 CFD 模拟 该程序允许使用所谓的日志文件对模拟设置进行部分自动化 我刚刚知道该日志
  • EF 一对一更新失败

    我在 EF6 中定义了一对一关系 适用于插入 不幸的是 当我尝试使用断开连接的记录进行更新时 我收到错误 详细信息如下 NET 来源 namespace EF ConsoleApp Test public class Program pub
  • 如何在 HTML5 画布上绘制模糊的圆圈?

    我可以在 HTML5 画布上绘制一个简单的圆圈 但我想在它周围添加一些模糊效果 我发现的是这个网站 http flashcanvas net examples uupaa js spinoff googlecode com svn trun
  • Plone 4.3 升级后 TinyMCE 工具栏丢失

    我将 Plone 站点从 4 2 升级到 4 3 升级步骤基本上是 运行 install sh 以拥有 4 3 环境 将 Data fs 复制到 var filestorage 并将自定义敏捷包复制到 src 在ZMI中运行升级 一切看起来
  • Cmake 与 make 示例代码?

    我想知道是否有任何示例代码Makefiles make and CMakeLists txt cmake 两者都做同样的事情 唯一的区别是一个是写在make另一个在cmake 我尝试寻找 cmake vs make 但从未找到任何代码比较
  • Angular js - 错误:[$parse:lval] 尝试将值分配给非左值[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我的这行代码有一个错误 但代码完成了它的使命 我不明白会发生什么 我对角度很陌生
  • Android 编程断言

    你能在android编程中使用断言吗 如果是这样 你如何在 Eclipse 中启用它 因为问题是是否可能 是的 这是可能的 但我同意 CommonsWare 认为应该避免断言 无论如何看到我可以在 Android 设备上使用断言吗 http
  • Spark 1.6 在 EMR 上写入 S3,因为 Parquet 挂起并失败

    我正在创建一个 uber jar Spark 应用程序 将其提交到 EMR 4 3 集群 我正在配置 4 个 r3 xlarge 实例 其中一个作为主实例 另外三个作为核心 我从控制台预安装了 hadoop 2 7 1 ganglia 3
  • 递归构造函数调用错误找不到解决方案

    我在四个公共金枪鱼部分 部分 可能是一个类或其他东西 处收到递归构造溢出调用错误 它适用于教程 但不适合我 似乎看不到在哪里 public class tuna private int hour private int minute pri
  • 如何检查变量是否是数组?

    我对变量名有一个循环 我需要检查变量的内容是否是数组 for varname in AA BB CC do local val if varname is array then how can I perform this test ech
  • 如何在 Chrome DevTools 网络面板中按文本和属性进行过滤?

    我想通过 URL 中的方法属性和文本过滤 Chrome DevTool 的网络面板 例如 如果我在 URL 中搜索文本 chromequestion 并且仅搜索 HTTP GET 请求 忽略 PUT POST DELETE 等 I am a
  • JOOQ 查询的时间戳精度

    我有一个 PSQL 原始查询 我想将其转换为 JOOQ 查询 SELECT DISTINCT date trunc day ref date AS refdate FROM income WHERE probos id probosId 我
  • 在 python lxml 库中使用西里尔字母的正确方法是什么

    我尝试生成其中包含西里尔字母符号的 xml 文件 但结果却出人意料 避免这种结果的最简单方法是什么 例子 from lxml import etree root etree Element print etree tostring root
  • 监听元素的创建,并在元素出现在 Chrome 扩展程序的页面上时触发事件

    是否可以让 Chrome 扩展监听尚未创建的元素的出现 假设用户单击按钮并且单击事件创建一个元素 div My Div div 并将其添加到页面 DOM 是否可以设置一个侦听器 在该元素出现时自动触发事件 或者我是否必须每隔 X 毫秒轮询页
  • 智能字段注释 - valuehelp 下拉菜单

    我有一个值帮助字段 并且只想在下拉列表中查看说明 而不是代码 选择后 想要将代码存储在另一个处于隐藏模式的字段中 为此 我定义了以下注释
  • 还有比 PHPDoc 更好的吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有人使用其他任何东西来记录他们的PHP代码比PHPDoc 是否有任何工具可以读取相同的文档语法但提
  • 在 PowerShell 中启用本地用户权限分配

    我之前问过类似的问题 以便在某个域用户的 PowerShell 中获得本地用户权限 现在我想启用该权限 我希望启用一些权限 但在本示例中 我将使用登录作为批处理作业 默认情况下 Windows Server 2008 中没有 Ntright
  • Knockout 中 Observable 的设置值未更新

    每天都有大量的问题链接回为什么我不能设置可观察值的值 而不是有这么多不同的答案说同样的事情 我想创建一个问题供每个人参考 Knockout Observable Observable Array 的设置值不会更新 设置我的可观察 obser
  • 使用 OpenXML 将背景图像添加到 Excel

    我正在使用 Open XML 创建 Excel 我想向 Excel 添加背景图像 不要告诉我将图像添加到 Excel 并与 OpenXML Productivity Tool 进行比较 请让我知道执行此操作的提取方法 我已经深入研究使用 O
  • 如何在Flask Sqlalchemy中分离Master Slave(DB读/写)

    我正在尝试通过 Flask Sqlalchemy 分离读取和写入数据库操作 我正在使用绑定来连接到 mysql 数据库 我想在主机中执行写入操作并从从机中读取操作 似乎没有内置的方法来处理这个问题 我是Python新手 很惊讶像这样急需的功