【发布时间】:2020-03-20 13:51:02
【问题描述】:
我有多个数据库,比如order_db1、order_db2、order_db3,
但他们都有表order,但order_db1.order中的数据与order_db2.order不同,
order_db1.order
|编号 |数量|
| 1| 100|
order_db2.order
|编号 |数量|
| 1| 200|
flask_sqlalchemy如何访问多个同名数据库?
我试过这样,用SQLALCHEMY_BINDS:
# -*- coding: utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import logging
class Application(Flask):
def __init__(self, import_name):
super(Application, self).__init__(import_name)
app = Application(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_BINDS'] = {
'order_db1': 'mysql://%s:%s@%s/order_db1' % (mysql_user, quote_plus(mysql_pwd),mysql_host),
'order_db2': 'mysql://%s:%s@%s/order_db2' % (mysql_user, quote_plus(mysql_pwd),mysql_host),
}
class Order1(db.model):
__bind_key__ = 'order_db1'
__tablename__ = 'order'
id = db.colum(db.Interger)
amount = db.colum(db.Interger)
class Order2(db.model):
__bind_key__ = 'order_db2'
__tablename__ = 'order'
id = db.colum(db.Interger)
amount = db.colum(db.Interger)
q1=Order1.query.get(1)
q2=Order2.query.get(1)
它告诉我:
'sqlalchemy.exc.InvalidRequestError: 已经为此 MetaData 实例定义了表 'order'。指定 'extend_existing=True' 以重新定义现有 Table 对象上的选项和列。'
但是如果我添加__table_args = {'extend_existing': True}
class Order1(db.model):
__bind_key__ = 'order_db1'
__tablename__ = 'order'
__table_args = {'extend_existing': True}
id = db.colum(db.Interger)
amount = db.colum(db.Interger)
class Order2(db.model):
__bind_key__ = 'order_db2'
__tablename__ = 'order'
__table_args = {'extend_existing': True}
id = db.colum(db.Interger)
amount = db.colum(db.Interger)
q1=Order1.query.get(1)
q2=Order2.query.get(1)
q1中的数据与q2相同,表示id=1,amount=200
我想要这样:
q1:id=1,金额=100
q2:id=1,金额=200
【问题讨论】:
-
您是否按照documentation 中的说明声明了绑定。如果是,请提供代码。
-
是的,我声明了它并用代码更新了我的问题
-
存在绑定和相同表名的已知问题。看到这个discussion 和这个可能的workaround。
标签: sqlalchemy flask-sqlalchemy