【问题标题】:Is there a way to add mySQL database/schema name in flask sqlalchemy connection有没有办法在烧瓶 sqlalchemy 连接中添加 mySQL 数据库/模式名称
【发布时间】: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 不。我使用了其他一些方法,但无法达到本文中所期望的目标。刚刚看到您的解决方案,似乎很有趣。我会尽快检查并更新您。谢谢。

标签: python mysql flask sqlalchemy


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 2019-02-10
    • 2013-08-29
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多