私は列名を変更しようとしています。最初の試みは、このスクリプトを使用していた:私のdevのデータベース(SQLiteの)上migrate.py test
を実行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')
は動作しますので、アップグレードとダウングレードを行います。しかし、それをHerokuのテスト環境(PostgreSQL 8.3が使用されている)にデプロイするとき、アップグレードしようとするとトレースがあります。
sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "id" does not exist
次に、アップグレード方法でusers.c.user_id
を使用しようとしました。それはすでにSQLAlchemyの-移行スクリプトをコピー&ペーストモデルに練習をお勧めします
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')
:それは両方の環境:
AttributeError: user_id
私が今使っている問題を回避するには失敗したことは、このスクリプトです。しかし、この余分な複製は、私にはあまりにも多すぎます。誰にどのようにこれを行う必要があります知っている。それがバグだと仮定して、回避策をいくつかDRYする方法を提案したいと思います。
いいえ、スキーマの移行でautoload = Trueを使用することには注意が必要です。将来を見据えて、ダウングレードで変更を逆に適用することを忘れないでください!あなたがしなければ、あなたは多分エラーを(おそらく)得るでしょう! –