我正在尝试更改列名。第一次尝试是使用这个脚本:
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')
在我的开发数据库(sqlite)上运行migrate.py test
有效,升级和降级也是如此。但是当我将它部署到我在 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 脚本中。但是这种额外的重复对我来说有点太多了。任何人都知道这应该怎么做。假设这是一个错误,我想就如何干掉一些解决方法提出建议。