2017-06-19 94 views
1

我使用Alembic 0.8.9,SQLAlchemy 1.1.4和我的数据库是MySQL数据库。
我在变更表,外国塔的处理:Alembic,如何更改ForeigenKey列

在我的数据库,我重命名“机关”表被命名为“目的”。 使用

from alembic import op 

def upgrade(): 
    op.rename_table('organs', 'purposes') 

在那之后,我想更新我的ForeignKey的在不同的充表:

之前

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迁移脚本这一变化将在数据库中得到体现。我如何改变一个ForeignKey列?

感谢您的帮助

+0

为什么 “改变”?这看起来更像是“删除organ_id,添加purpose_id”。 – sebastian

+0

如果我删除并添加,我的数据不会丢失吗?我也将表格'器官'重命名为'目的'。 –

+0

没错 - 我不知道你的实际目标是重命名外表。在这种情况下,我的下降&创建确实是不明智的我猜 – sebastian

回答

0

感谢您的有益的意见,导致我寻找更多的关于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"])