Próbuję zmienić nazwę kolumny. Pierwsza próba była z tego skryptu:Jak napisać zmianę migracji nazw kolumn za pomocą sqlalchemy-migrate?
meta = MetaData()
users = Table('users', meta,
Column('id', Integer, primary_key=True),
Column('name', String(50), unique=True),
Column('email', String(120), unique=True)
)
def upgrade(migrate_engine):
meta.bind = migrate_engine
users.c.id.alter(name='id')
def downgrade(migrate_engine):
meta.bind = migrate_engine
users.c.id.alter(name='user_id')
Running migrate.py test
na mojej bazy danych dev (sqlite) działa tak jak i modernizacji i obniżki. Ale kiedy wdrażam go do mojego środowiska testowego na Heroku (gdzie używa się PostgreSQL 8.3), dostaję ślad, gdy próbuję dokonać aktualizacji. Gist to ta wiadomość:
sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "id" does not exist
Następnie spróbowałem użyć users.c.user_id
w metodzie aktualizacji. Że nie w obu środowiskach .:
AttributeError: user_id
Obejście używam teraz jest ten skrypt:
meta_old = MetaData()
meta_new = MetaData()
users_old = Table('users', meta_old,
Column('user_id', Integer, primary_key=True),
Column('name', String(50), unique=True),
Column('email', String(120), unique=True)
)
users_new = Table('users', meta_new,
Column('id', Integer, primary_key=True),
Column('name', String(50), unique=True),
Column('email', String(120), unique=True)
)
def upgrade(migrate_engine):
meta_old.bind = migrate_engine
users_old.c.user_id.alter(name='id')
def downgrade(migrate_engine):
meta_new.bind = migrate_engine
users_new.c.id.alter(name='user_id')
To już zalecane praktyki skopiować i wkleić model do skryptów sqlalchemy-migrować. Ale dodatkowe duplikacje są dla mnie trochę za duże. Każdy wie, jak to zrobić. Zakładając, że jest to błąd, chciałbym sugestie, w jaki sposób DRY up to obejście niektórych.
Przyjemnie, chociaż nie podoba mi się używanie autoload = True w migracjach schematu. Tylko w heads-upie do przyszłości, pamiętaj, aby zastosować zmiany w odwrotnej kolejności w downgrade! Jeśli tego nie zrobisz, (prawdopodobnie) dostaniesz mnóstwo błędów! –