from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@127.0.0.1/database1?charset=utf8mb4'
app.config['SQLALCHEMY_BINDS'] = {
# 'database1': 'mysql+pymysql://root:@127.0.0.1/database1?charset=utf8mb4'
'database2': 'mysql+pymysql://root:@127.0.0.1/database2?charset=utf8mb4'
}
db = SQLAlchemy(app)
class Table1(db.Model):
__tablename__ = "table1"
# __bind_key__ = "database1"
# __table_args__ = {'schema': 'database1'}
id = db.Column(db.Integer, primary_key=True)
relation_id = db.Column(db.Integer, db.ForeignKey('database2.table2.id'))
class Table2(db.Model):
__bind_key__ = "database2"
__tablename__ = "table2"
__table_args__ = {'schema': 'database2'}
id = db.Column(db.Integer, primary_key=True)
db.create_all()
看了文档,说没有 bind_key 就默认用 SQLALCHEMY_DATABASE_URI,但是在以上测试的时候发现不行,不能建表,如果把以上代码中的注释全部去掉,就可以了,这是为什么,然道 SQLALCHEMY_DATABASE_URI 没用了吗?
还有,这是在有 relation_id 这个 foreign key 的情况下才有这种情况,如果把这个 foreign key 删了,以上代码也可以运行。
1
aiver 2019-06-20 17:50:04 +08:00
1、SQLALCHEMY_DATABASE_URI 是默认连接,是在没有配置 SQLALCHEMY_BINDS 的时候才使用的,你上面已经配置了 SQLALCHEMY_BINDS,所以不会使用默认连接了,所以它找不到 database1 的连接
2、上面的 relation_id 感觉写错了,只需要 tablename.id 即可 3、你的 SQLALCHEMY_BINDS 配置里面第一行是否漏写了一个逗号(,)? |
2
coolair OP @aiver
1、我在 class 里如果没有配置__bind_key__话,还是使用 SQLALCHEMY_DATABASE_URI 默认连接。配置了__bind_key__才会用 SQLALCHEMY_BINDS。 2、Table1 是在 database1,如果不包含 database2 的话,就找不到这个表了。 3、确实漏写了一个逗号。 |