Alembic,如何更改 ForeigenKey 列
Alembic, How to alter a ForeigenKey Column
我使用的是 Alembic 0.8.9、SQLAlchemy 1.1.4,我的数据库是 MySQL 数据库。
我正在更改 table 和一个外列:
在我的数据库中,我将“organs”table 重命名为“purposes”。
使用
from alembic import op
def upgrade():
op.rename_table('organs', 'purposes')
在那之后,我想在不同的 table 中更新我的外键:
之前
class Order(DeclarativeBase):
__tablename__ = 'orders'
id = Column(Integer, autoincrement=True, primary_key=True)
organ_id = Column(Integer, ForeignKey('organs.id'))
之后
class Order(DeclarativeBase):
__tablename__ = 'orders'
id = Column(Integer, autoincrement=True, primary_key=True)
purpose_id = Column(Integer, ForeignKey('purposes.id'))
我需要帮助编写 Alembic 迁移脚本,以便将此更改反映在数据库中。如何更改外键列?
感谢帮助
感谢您提供的有用评论,让我搜索了更多关于 SQL 外键的信息。我想我现在明白了。
这个答案给我指明了方向:
How to change the foreign key referential action? (behavior)
基本上我需要做的是重命名列(保存数据),删除旧的外键(约束?)并创建一个新的。
这是我的迁移脚本:
from alembic import op
import sqlalchemy as sa
def upgrade():
op.rename_table('organs', 'purposes')
op.alter_column('orders', 'organ_id', new_column_name='purpose_id', existing_type=sa.Integer)
op.drop_constraint(constraint_name="orders_ibfk_2", table_name="orders", type_="foreignkey")
op.create_foreign_key(
constraint_name="orders_ibfk_2",
source_table="orders",
referent_table="purposes",
local_cols=["purpose_id"],
remote_cols=["id"])
def downgrade():
op.rename_table('purposes', 'organs')
op.alter_column('orders', 'purpose_id', new_column_name='organ_id', existing_type=sa.Integer)
op.drop_constraint(constraint_name="orders_ibfk_2", table_name="orders", type_="foreignkey")
op.create_foreign_key(
constraint_name="orders_ibfk_2",
source_table="orders",
referent_table="organs",
local_cols=["organ_id"],
remote_cols=["id"])
我使用的是 Alembic 0.8.9、SQLAlchemy 1.1.4,我的数据库是 MySQL 数据库。
我正在更改 table 和一个外列:
在我的数据库中,我将“organs”table 重命名为“purposes”。 使用
from alembic import op
def upgrade():
op.rename_table('organs', 'purposes')
在那之后,我想在不同的 table 中更新我的外键:
之前
class Order(DeclarativeBase):
__tablename__ = 'orders'
id = Column(Integer, autoincrement=True, primary_key=True)
organ_id = Column(Integer, ForeignKey('organs.id'))
之后
class Order(DeclarativeBase):
__tablename__ = 'orders'
id = Column(Integer, autoincrement=True, primary_key=True)
purpose_id = Column(Integer, ForeignKey('purposes.id'))
我需要帮助编写 Alembic 迁移脚本,以便将此更改反映在数据库中。如何更改外键列?
感谢帮助
感谢您提供的有用评论,让我搜索了更多关于 SQL 外键的信息。我想我现在明白了。
这个答案给我指明了方向:
How to change the foreign key referential action? (behavior)
基本上我需要做的是重命名列(保存数据),删除旧的外键(约束?)并创建一个新的。
这是我的迁移脚本:
from alembic import op
import sqlalchemy as sa
def upgrade():
op.rename_table('organs', 'purposes')
op.alter_column('orders', 'organ_id', new_column_name='purpose_id', existing_type=sa.Integer)
op.drop_constraint(constraint_name="orders_ibfk_2", table_name="orders", type_="foreignkey")
op.create_foreign_key(
constraint_name="orders_ibfk_2",
source_table="orders",
referent_table="purposes",
local_cols=["purpose_id"],
remote_cols=["id"])
def downgrade():
op.rename_table('purposes', 'organs')
op.alter_column('orders', 'purpose_id', new_column_name='organ_id', existing_type=sa.Integer)
op.drop_constraint(constraint_name="orders_ibfk_2", table_name="orders", type_="foreignkey")
op.create_foreign_key(
constraint_name="orders_ibfk_2",
source_table="orders",
referent_table="organs",
local_cols=["organ_id"],
remote_cols=["id"])