Skip to main content
 首页 » 编程设计

python - 更改 Alembic 中的主键

2023年05月26日8insus

我已通读 the docs ,但我在任何地方都找不到这方面的说明。我尝试删除旧 key 并添加一个新 key ,但这让我出错:

op.drop_constraint('PRIMARY', 'some_table', type_='primary') 
op.create_primary_key('PRIMARY', 'some_table', ['col1', 'col2']) 
 
sqlalchemy.exc.OperationalError: (OperationalError) (1025, "Error on rename of ... (errno: 150 - Foreign key constraint is incorrectly formed)") 'ALTER TABLE some_table DROP PRIMARY KEY ' () 

我做错了什么?

请您参考如下方法:

我也遇到了同样的情况:改变主键。就我而言,我必须将主键类型从整数更改为字符串。

主键还与另一个表有外键关系。较早的 alembic 迁移通过以下方式创建了外键约束:

#!/usr/bin/python3 
 
from alembic import op 
import sqlalchemy as sa 
 
 
def upgrade(): 
    op.create_table('user', 
                    sa.Column('id', sa.Integer(), nullable=False), 
                    sa.Column('name', sa.String(length=100), nullable=False), 
                    sa.Column('username', sa.String(length=100), nullable=False), 
                    sa.PrimaryKeyConstraint('id', name=op.f('pk_user')), 
                    sa.UniqueConstraint('username', name=op.f('uq_user_username')) 
                    ) 
 
    op.create_table('role', 
                    sa.Column('id', sa.Integer, primary_key=True), 
                    sa.Column('name', sa.String(100)), 
                    sa.Column('description', sa.String(255)), 
                    sa.PrimaryKeyConstraint('id', name=op.f('pk_role')) 
                    ) 
 
    op.create_table('roles_users', 
                    sa.Column('user_id', sa.Integer, nullable=True), 
                    sa.Column('role_id', sa.Integer, nullable=True), 
                    sa.ForeignKeyConstraint(['user_id'], ['user.id'], 
                                            name=op.f('fk_roles_user_user_id_user')), 
                    sa.ForeignKeyConstraint(['role_id'], ['role.id'], 
                                            name=op.f('fk_roles_user_role_id_role')) 
                    ) 

现在,当将 user 表的主键类型从 Integer 更改为 String 时,我必须执行以下操作:

from alembic import op 
import sqlalchemy as sa 
 
 
def upgrade(): 
    # Drop primary key constraint. Note the CASCASE clause - this deletes the foreign key constraint. 
    op.execute('ALTER TABLE user DROP CONSTRAINT pk_user CASCADE') 
    # Change primary key type 
    op.alter_column('user', 'id', existing_type=sa.Integer, type_=sa.VARCHAR(length=25)) 
    op.alter_column('roles_users', 'user_id', existing_type=sa.Integer, type_=sa.VARCHAR(length=25)) 
    # Re-create the primary key constraint 
    op.create_primary_key('pk_user', 'user', ['id']) 
    # Re-create the foreign key constraint 
    op.create_foreign_key('fk_roles_user_user_id_user', 'roles_users', 'user', ['user_id'], ['id'], ondelete='CASCADE') 

Flask 版本:0.12.1

Alembic 版本:0.9.1

Python 版本:3.4.4

希望这些信息对面临类似问题的人有所帮助。