qizhiyi / sqlalchemy-migrate

Automatically exported from code.google.com/p/sqlalchemy-migrate
MIT License
0 stars 0 forks source link

Strange behaviour for column alter name on PostgreSQL 8.3 #130

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
I'm trying to alter a column name. First attempt was with this script:

    meta = MetaData()

    users = Table('users', meta,
        Column('user_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.user_id.alter(name='id')

    def downgrade(migrate_engine):
        meta.bind = migrate_engine
        users.c.user_id.alter(name='user_id')

Running `migrate.py test` on my dev database (sqlite) works and so does 
upgrading and downgrading. But when deploying it to my test environment on 
Heroku (where PostgreSQL 8.3 is used) I get a trace when I try to downgrade. 
Gist is this message:

    sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "user_id" does not exist 

I then tried to use `users.c.id`in the downgrade method. That fails in both 
environments.:

    AttributeError: id

What version of the product are you using? On what operating system?

My dev environment is Mac OSX Lion, Python 2.7.2 and:

SQLAlchemy==0.7.2
pysqlite==2.6.3
sqlalchemy-migrate==0.7.1

On Heroku (a linux stack) it's Python 2.7.1 and:

SQLAlchemy==0.7.2
psycopg2==2.4.2
sqlalchemy-migrate==0.7.1

The workaround I'm using now is this script:

    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')

Original issue reported on code.google.com by CoB...@gmail.com on 5 Oct 2011 at 8:49

GoogleCodeExporter commented 8 years ago
This is not an issue in migrate but how the MetaData mechanism works. You could 
use reflection to get the Table instance:

def upgrade(migrate_engine):
    meta = MetaData(bind=migrate_engine)
    users = Table('users', meta, autoload=True)
    users.c.user_id.alter(name='id')

def downgrade(migrate_engine):
    meta = MetaData(bind=migrate_engine)
    users = Table('users', meta, autoload=True)
    users.c.id.alter(name='user_id')

Original comment by jan.ditt...@gmail.com on 6 Oct 2011 at 8:18

GoogleCodeExporter commented 8 years ago
Ah, that's such an improvement over my "workaround". Thanks!

Original comment by CoB...@gmail.com on 6 Oct 2011 at 10:03