Я пытаюсь изменить имя столбца. Первая попытка была с этим сценарием:
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')
Запуск migrate.py test
в моей базе данных dev (sqlite) работает так же, как и обновление и понижение. Но при развертывании его в моей тестовой среде на Heroku (где используется PostgreSQL 8.3) я получаю трассировку при попытке обновить. Суть этого сообщения:
sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "id" does not exist
Затем я попытался использовать users.c.user_id
в методе обновления. Это не удается в обеих средах.
AttributeError: user_id
Обходное решение, которое я сейчас использую, - это скрипт:
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')
Уже рекомендуется практиковать копирование-вставку модели в сценарии sqlalchemy-migrate. Но это лишнее дублирование становится слишком большим для меня. Кто-нибудь знает, как это должно быть сделано. Предполагая, что это ошибка, я хотел бы посоветовать, как высушить обходной путь.