一、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'
解决方案:
-
找到 migrate 生成的文件夹
migrations
,在versions
找到最近版本 -
导入
sqlalchemy_utils
和你的 models
import sqlalchemy_utils from app import models
-
在使用到
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'}
)