列名を変更しようとしています。最初の試みはこのスクリプトでした:
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
私の開発データベース(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 スクリプトに貼り付けることは、既に推奨されている方法です。しかし、この余分な重複は私には少し多すぎます。これをどのように行うべきかは誰でも知っています。バグだと仮定して、回避策をいくつか DRY する方法について提案をお願いします。