有没有办法在烧瓶 sqlalchemy 连接中添加 mySQL 数据库/模式名称

Posted

技术标签:

【中文标题】有没有办法在烧瓶 sqlalchemy 连接中添加 mySQL 数据库/模式名称【英文标题】:Is there a way to add mySQL database/schema name in flask sqlalchemy connection 【发布时间】:2022-01-14 00:05:03 【问题描述】:

我有一个烧瓶 restful 应用程序连接到 mysql 数据库,我正在使用 SQLAlchemy。我们可以使用以下命令连接到 mySQL 服务器 -

app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://root:password@127.0.0.1:3306"

我正在研究一个用例,其中将通过GET 请求实时提供数据库名称。根据提供的数据库名称,应用程序将连接到相应的数据库并执行操作。为此,我想有一种方法可以告诉烧瓶应用程序与提供的数据库对话(烧瓶应用程序已经连接到 mySQL 服务器)。目前,我正在 API 类中再次创建连接。

API:Calculate.py

from flask_restful import Resource, reqparse
from app import app


class Calculate(Resource):

    def get(self):

        parser = reqparse.RequestParser()
        parser.add_argument('schema', type=str, required=True, help='Provide schema name.')
        args = parser.parse_args()

        session['schema_name'] = args.get('schema')

        app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://root:password@127.0.0.1:3306/session['schema_name']"

        from db_models.User import User

        ...

数据库模型:User.py

from flask import session
from flask_sqlalchemy import SQLAlchemy
from app import app

db = SQLAlchemy(app)


class User(db.Model):

    __tablename__ = 'user'
    __table_args__ = "schema": session['schema_name']

    User_ID = db.Column(db.Integer, primary_key=True)
    Name    = db.Column(db.String(50))

db.create_all()

上面的东西对我有用。但我想了解是否有替代方法或更好的方法。

编辑:上面的代码不起作用。即使我在应用程序的同一个运行实例中提供了新的架构名称,它也会引用提供的第一个架构名称。

【问题讨论】:

关于一个小问题,你调试过这段代码吗?也许正在发生的事情是您的会话字典没有被更新。另外我在Calculate from flask import session上看不到这条线 所以我在这里错过了那部分,因为我只复制粘贴了程序的一部分。是的,字典没有更新。无论第一次提供什么连接,它都会继续指向该连接。 app.config['SQLALCHEMY_DATABASE_URI'] = f"...." 这行好像没有效果。 这个问题你解决了吗? @Carlos 不。我使用了其他一些方法,但无法达到本文中所期望的目标。刚刚看到您的解决方案,似乎很有趣。我会尽快检查并更新您。谢谢。 【参考方案1】:

你可以这样写 SQLALCHEMY 路径:

SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:password@localhost:3306/数据库名称'

【讨论】:

我知道,我已经用过这个了。请您再次阅读问题。【参考方案2】:

根据文档not all values can be updated(第一段),在您的用例中,您应该在用例中使用SQLALCHEMY_BINDS 变量,这是一个字典并为每个模式创建一个模型。示例:

数据库模型

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://root:password@127.0.0.1:3306/schema_name1"
SQLALCHEMY_BINDS = 
    'db1': SQLALCHEMY_DATABASE_URI, # default
    'db2': f"mysql+pymysql://root:password@127.0.0.1:3306/schema_name2"


app = Flask(__name__)
db = SQLALchemy(app)

然后为每个模式创建一个模型

class UserModeldb1(db.Model):

  __tablename__ = 'user'
  __bind_key__ = 'db1' #this parameter is set according to the database

  id = db.Column(db.Integer, primary_key=True)
  ...


class UserModeldb2(db.Model):

  __tablename__ = 'user'
  __bind_key__ = 'db2'

  id = db.Column(db.Integer, primary_key=True)
...

最后在您的 get 方法中添加一些逻辑来捕获模式并相应地执行您的模型。你应该看看这个问题真的很有帮助Configuring Flask-SQLAlchemy to use multiple databases with Flask-Restless

【讨论】:

以上是关于有没有办法在烧瓶 sqlalchemy 连接中添加 mySQL 数据库/模式名称的主要内容,如果未能解决你的问题,请参考以下文章

create_engine 中的烧瓶 SQLAlchemy KeyError 'False'

使用 mysql 和烧瓶登录的 Flask-sqlalchemy 损坏管道错误 32

在烧瓶中使用 SqlAlchemy 模型

使用来自 SQLAlchemy 对象的数据在烧瓶中预填充 WTforms

烧瓶-sqlalchemy 或 sqlalchemy

SQLAlchemy 合并()不使用烧瓶工作