Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Alembic中更改主键?_Python_Sqlalchemy_Alembic - Fatal编程技术网

Python 在Alembic中更改主键?

Python 在Alembic中更改主键?,python,sqlalchemy,alembic,Python,Sqlalchemy,Alembic,我已经通读了,但是我在任何地方都找不到关于这个的说明。我尝试删除旧密钥并添加新密钥,但这会导致错误: op.drop_constraint('PRIMARY', 'some_table', type_='primary') op.create_primary_key('PRIMARY', 'some_table', ['col1', 'col2']) sqlalchemy.exc.OperationalError: (OperationalError) (1025, "Error on ren

我已经通读了,但是我在任何地方都找不到关于这个的说明。我尝试删除旧密钥并添加新密钥,但这会导致错误:

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 ' ()

我做错了什么?

我在寻找迁移示例时遇到了这个问题。下面是我的完整迁移,它删除了PK约束,并添加了一个新的
自动增量
PK:

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.mysql import INTEGER


def upgrade():
    op.drop_constraint('PRIMARY', 'similar_orders', type_='primary')

    op.execute("ALTER TABLE similar_orders ADD COLUMN id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT")


def downgrade():
    op.drop_column('similar_orders', 'id')

    op.create_primary_key("similar_orders_pk", "similar_orders", ["order_id", ])

在alembic中,更改列上的PK不起作用,请改用drop_约束,请参阅。希望这有帮助

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

主键还与另一个表具有外键关系。早期的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')
烧瓶版本:
0.12.1

Alembic版本:
0.9.1

Python版本:
3.4.4


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

这不是一回事,但这可能会有所帮助:@RachelSanders我在寻找答案时发现了这一点。但我希望自2012年以来有所改善。谢谢你的回复@Eli如果你下一次找到你自己问题的答案,把它贴在下面,那将非常有用。在谷歌快速搜索“alembic alter主键”时,这篇文章是第一个结果。我不想让人觉得我是个混蛋,但是一个问题,加上原始海报上“我找到了答案”的更新,没有更多的细节,对社区来说真的没有任何帮助:-/@Frito你误读了我的评论。我没有比拉谢尔桑德斯更好的答案了。我仍然希望将来能给Alembic添加一个更好的方法,但目前我没有更好的答案来发布。@Eli-Ha!你确实是对的。我确实误读了你的评论。我道歉。对于阅读注释的其他人,我最终遇到了一个问题,上面的错误(150)是由于引用我试图更新的表的PK的FK约束引起的。我最终删除了这个约束,更新了我的PK,然后重新添加了约束。+1这个答案不仅告诉我如何更改主键,在我的Postgres DB中,Alembic/SA创建的PK约束使用
user\u pkey
模式命名,而不是
PK\u user
这是我的解决方案(向复合主键添加一个新列)。在我的例子中,由SQLAlchemy自动生成的约束名为
\u pkey
。这对我来说非常有效!感谢您不再使用原始的SQL
execute
,您可能可以沿着这些思路做一些事情来保持原生alembic和SQLAlchemy:
op.add_列('similous_orders',sa.column('id',sa.Integer,nullable=False,autoincrement=True,primary_key=True))