每次迁移时,Alembic都会重新创建外键,从而导致表上的外键重复

我有一个使用sql-alchemy的flask应用程序,并且flask迁移来处理数据库更改。每次我进行烧瓶迁移以创建Alembic更新数据库的脚本时,该脚本都包含创建数据库中已经存在的外键的命令。

models.py中的表定义是

nordvpn whitelist add port 22

在迁移数据库更新脚本中用于创建外键的行是

class Airline(db.Model):

    __tablename__ = 'Airlines'
    AirlineID =         db.Column(db.Integer,primary_key=True)
    AirlineshortCode =  db.Column(db.String(3),index=True,unique=True,nullable=False)
    FullName =          db.Column(db.String(256),unique=False,nullable=True)
    ShortName =         db.Column(db.String(64),nullable=True)

class CabinClass(db.Model):

    __tablename__ = 'CabinClasses'
    CabinClassID =         db.Column(db.Integer,primary_key=True)
    AirlineshortCode =     db.Column(db.ForeignKey("Airlines.AirlineshortCode"),nullable=True)
    CabinClassShortCode =  db.Column(db.String(32),nullable=False)
    CabinClassname =       db.Column(db.String(64),nullable=True)

每次创建迁移脚本时都会生成此行,从而在CabinClasses表中导致多个外键条目:

每次迁移时,Alembic都会重新创建外键,从而导致表上的外键重复

我看到创建的每个外键的名称都不同,并且数据库迁移脚本中的 op.create_foreign_key(None,'CabinClasses','Airlines',['AirlineshortCode'],['AirlineshortCode']) 命令将该名称表示为create_foreign_key。我相信如果您使用的是自动命名方案(我相信默认情况下会发生这种情况

)是正确的
  

对于使用自动命名方案的设置,例如所述   在“配置约束命名约定”中,此处的名称可以是“无”,   因为事件侦听器会将名称应用于约束对象   与表格关联时

https://alembic.sqlalchemy.org/en/latest/naming.html

有人能识别出什么导致每次我更新数据库时都会创建这些外键吗?

leijian_113 回答:每次迁移时,Alembic都会重新创建外键,从而导致表上的外键重复

您所获得的约束的名称看起来好像来自数据库,而不是SQLAlchemy。您需要将所有类型的约束的约束命名模板添加到SQLAlchemy元数据,然后,我认为您将获得一致的名称。在Flask-SQLAlchemy documentation中了解如何执行此操作。为了方便起见,我正在从下面的文档中复制代码示例:

from sqlalchemy import MetaData
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

convention = {
    "ix": 'ix_%(column_0_label)s',"uq": "uq_%(table_name)s_%(column_0_name)s","ck": "ck_%(table_name)s_%(constraint_name)s","fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s","pk": "pk_%(table_name)s"
}

metadata = MetaData(naming_convention=convention)
db = SQLAlchemy(app,metadata=metadata)
本文链接:https://www.f2er.com/2975680.html

大家都在问