记一次 Flask Sqlalchemy 连接多个数据库 并 分库 migrate 进行多数据库迁移 init multidb 解决 sqlalchemy_utils 迁移报错

一、flask sqlalchemy 多数据库连接配置

在BINDS里不需要写默认的数据库连接配置
在BINDS里不需要写默认的数据库连接配置
在BINDS里不需要写默认的数据库连接配置

否则会导致多数据库表迁移时卡住,即使平常使用时没有异常

    # sqlalchemy.config 配置多个数据库连接
    SQLALCHEMY_BINDS = {
        'ir': "mysql+pymysql://{}:{}@{}:{}/{}".format(*yml.ir_sql_config),
    }
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://{}:{}@{}:{}/{}".format(*yml.manage_sql_config) # 默认数据库引擎

已设置__bind_key__,则采用设置的数据库引擎 不设置即使用默认数据库引擎

class StandQuestion(BaseModel, db.Model):
    __tablename__ = 'xxxxxx'
    __bind_key__ = 'ir'  

二、flask 多数据库迁移

在 app 配置了第一步多数据库 bind 后

python app.py mc init --multidb

查看 Migrate 源码及文档:只有在 init 后加上 --multidb, Migrate 才会将 models 定义的表 **分别** 迁移到 SQLALCHEMY_BINDS 的多个数据库否则所有的表都将被迁移至默认绑定的数据库引擎上

之后正常执行迁移操作

python app.py mc migrate
python app.py mc upgrade

三、解决 sqlalchemy_utils 迁移报错

报错信息:TypeError: <flask_script.commands.Command object at 0x7fb20af95208>: __init__() missing 1 required positional argument: 'choices'

解决方案:

  1. 找到 migrate 生成的文件夹 migrations ,在versions 找到最近版本

  2. 导入 sqlalchemy_utils你的 models

    import sqlalchemy_utils
    from app import models
    
  3. 在使用到 ChoiceType 的地方加入对应的 choices

    比如:

    sa.Column('level', sqlalchemy_utils.types.choice.ChoiceType(models.Category.level_choices))
    

四、多对多指定数据库引擎

question_m_keywords = db.Table('question_m_keywords', db.metadata,

                               db.Column('question_id', db.Integer,
                                         db.ForeignKey('stand_question.id', ondelete='CASCADE')),

                               db.Column('keyword_id', db.Integer,
                                         db.ForeignKey('stand_keywords.id', ondelete='CASCADE')),
                               info={'bind_key': 'ir'}
                               )
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡泡码客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值