有没有办法在烧瓶 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()
上面的东西对我有用。但我想了解是否有替代方法或更好的方法。
编辑:上面的代码不起作用。即使我在应用程序的同一个运行实例中提供了新的架构名称,它也会引用提供的第一个架构名称。
【问题讨论】:
关于一个小问题,你调试过这段代码吗?也许正在发生的事情是您的会话字典没有被更新。另外我在Calculatefrom 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