将组合主键添加到生产中的辅助关联表

时间:2019-05-17 18:32:03

标签: python postgresql sqlalchemy

我有一个表,其中包含设置错误:

ass_table = Table('ass', db.Model.metadata,
    Column('id1', db.Integer, db.ForeignKey('class1.id')),
    Column('id2', db.Integer, db.ForeignKey('class2.id')),
)

我真的应该在primary_key=TrueColumns上都添加PrimaryKeyConstraint('id1', 'id2', name='silly_me')

它最初创建的Alembic自动生成代码为:

op.create_table('ass',
    sa.Column('id1', sa.Integer(), nullable=True),
    sa.Column('id2', sa.Integer(), nullable=True),
    sa.ForeignKeyConstraint(['id2'], ['class2.id'], ),
    sa.ForeignKeyConstraint(['id1'], ['class1.id'], )
)

我确认我的Postgres数据库没有在ass表上建立主键。

现在添加代码不会自动生成一个Alembic脚本来迁移我的数据库。

添加必需的组合主键 而不中断或破坏生产中的现有数据 的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我不知道alembic,但是要在纯postgres中做到这一点,我会做以下事情:

CREATE UNIQUE INDEX CONCURRENTLY silly_me_idx ON ass(id1, id2);
ALTER TABLE ass ADD CONSTRAINT silly_me_pkey PRIMARY KEY USING INDEX silly_me_idx;