请教一个 Flask 多数据库连接的问题

2019-06-20 16:52:10 +08:00
 coolair
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 删了,以上代码也可以运行。

1214 次点击
所在节点    问与答
4 条回复
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 配置里面第一行是否漏写了一个逗号(,)?
coolair
2019-06-20 17:53:34 +08:00
@aiver
1、我在 class 里如果没有配置__bind_key__话,还是使用 SQLALCHEMY_DATABASE_URI 默认连接。配置了__bind_key__才会用 SQLALCHEMY_BINDS。
2、Table1 是在 database1,如果不包含 database2 的话,就找不到这个表了。
3、确实漏写了一个逗号。
aiver
2019-06-20 18:13:08 +08:00
@coolair
1、那你说的 SQLALCHEMY_DATABASE_URI 没用是什么意思,不配置__bind_key 不是生效了么?
2、flask 是根据表名来进行关联关系的,所以表名必须唯一,你在定义表的 class 时已经定义了相关的数据库及连接方式了,声明外键关联时不需要了
coolair
2019-06-20 18:23:33 +08:00
@aiver 你可以测试下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/575892

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX