2017-06-19 2 views
1

Ich benutze Alembic 0.8.9, SQLAlchemy 1.1.4 und meine Datenbank ist eine MySQL-Datenbank.
Ich bin im Begriff, eine Tabelle zu verändern, und eine Außen Säule:Alembic, Wie ändere ich eine ForeigenKey-Spalte

In meiner Datenbank, ich bin Umbenennung 'Organe Tisch genannt werden ‚Zwecke‘.

from alembic import op 

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

Danach verwenden, ich mag meine ForeignKey In einer differnt Tabelle aktualisieren:

Vor

class Order(DeclarativeBase): 
    __tablename__ = 'orders' 
    id = Column(Integer, autoincrement=True, primary_key=True) 

    organ_id = Column(Integer, ForeignKey('organs.id')) 

Und Nach

class Order(DeclarativeBase): 
    __tablename__ = 'orders' 
    id = Column(Integer, autoincrement=True, primary_key=True) 

    purpose_id = Column(Integer, ForeignKey('purposes.id')) 

Ich brauche Hilfe beim Schreiben ein Alembic-Migrations-Skript für Diese Änderung soll in der Datenbank widergespiegelt werden. Wie ändere ich eine ForeignKey-Spalte?

Danke für die Hilfe

+0

Warum "alter"? Dies scheint eher "organ_id entfernen, add zweck_id". – sebastian

+0

Wenn ich drop and add, werden meine Daten nicht verloren gehen? Ich benenne auch die Tabelle 'Organe' in 'Zwecke' um. –

+0

Das ist richtig - ich war mir nicht bewusst, dass Sie eigentlich Ziel ist die Umbenennung der fremden Tabelle. In diesem Fall ist mein Drop & Create in der Tat nicht sinnvoll, ich denke – sebastian

Antwort

0

Vielen Dank für die hilfreichen Kommentare, die meine führte ein bisschen mehr über SQL Fremdschlüssel zu suchen. Ich denke, ich habe es jetzt verstanden.
Diese Antwort zeigte mir den Weg:
How to change the foreign key referential action? (behavior)

Im Grunde, was ich war die Spalte umbenennen tun musste (die die Daten hält), fallen die alten Fremdschlüssel und erstellen Sie eine neue Stelle (Constraint?).

Hier ist mein Migrationsskript:

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"])