V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
coolair
V2EX  ›  问与答

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

  •  
  •   coolair · 2019-06-20 16:52:10 +08:00 · 1264 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 删了,以上代码也可以运行。

    4 条回复    2019-06-20 18:23:33 +08:00
    aiver
        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 配置里面第一行是否漏写了一个逗号(,)?
    coolair
        2
    coolair  
    OP
       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
        3
    aiver  
       2019-06-20 18:13:08 +08:00
    @coolair
    1、那你说的 SQLALCHEMY_DATABASE_URI 没用是什么意思,不配置__bind_key 不是生效了么?
    2、flask 是根据表名来进行关联关系的,所以表名必须唯一,你在定义表的 class 时已经定义了相关的数据库及连接方式了,声明外键关联时不需要了
    coolair
        4
    coolair  
    OP
       2019-06-20 18:23:33 +08:00 via Android
    @aiver 你可以测试下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   936 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 19:21 · PVG 03:21 · LAX 11:21 · JFK 14:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.