using: sqlalchemy: 0.6.4 (I cannot upgrade easily)
sqlalchemy-migrate: 0.7.1 (use this patch also)
mysql: 5.0.77 (I cannot upgrade this)
python: 2.4(I cannot upgrade this)
I made a test DB
I created the following table just fine
from sqlalchemy import *
from migrate import *
from migrate.changeset import schema
meta = MetaData()
account = Table('account', meta,
Column('id', Integer(), primary_key=True, nullable=False),
Column('login', String(length=40, convert_unicode=False,
assert_unicode=None,unicode_error=None, _warn_on_bytestring=False)),
Column('passwd', String(length=40, convert_unicode=False,
assert_unicode=None, unicode_error=None,
_warn_on_bytestring=False)),)
def upgrade(migrate_engine):
meta.bind = migrate_engine
account.create()
def downgrade(migrate_engine):
meta.bind = migrate_engine
account.drop()
When I decide to add a column I decided to use the new
features(create_model, make_update_script_for_model, etc) since they
should work.
I make a model which looks like this:
from sqlalchemy import *
meta = MetaData()
account = Table('account', meta,
Column('id', Integer(), primary_key=True, nullable=False),
Column('login', String(length=None, convert_unicode=False,
assert_unicode=None, unicode_error=None, _warn_on_bytestring=False)),
Column('passwd', String(length=None, convert_unicode=False,
assert_unicode=None, unicode_error=None, _warn_on_bytestring=False)),
Column('newcol', String(length=None, convert_unicode=False,
assert_unicode=None, unicode_error=None, _warn_on_bytestring=False)),)
which I modified from the output of create_model, then I call
./manage.py make_update_script_for_model --model=oldmodel:meta --
oldmodel=model:meta
and it appears I get correct output:
from sqlalchemy import *
from migrate import *
from migrate.changeset import schema
meta = MetaData()
account = Table('account', meta,
Column('id', Integer(), primary_key=True, nullable=False),
Column('login', String(length=None, convert_unicode=False,
assert_unicode=None, unicode_error=None, _warn_on_bytestring=False)),
Column('passwd', String(length=None, convert_unicode=False,
assert_unicode=None, unicode_error=None, _warn_on_bytestring=False)),
)
def upgrade(migrate_engine):
# Upgrade operations go here. Don't create your own engine; bind
migrate_engine
# to your metadata
meta.bind = migrate_engine
account.columns['newcol'].create()
def downgrade(migrate_engine):
# Operations to reverse the above upgrade go here.
meta.bind = migrate_engine
account.columns['newcol'].drop()
but when I run the test I get this:
Upgrading...
Traceback (most recent call last):
File "./manage.py", line 3, in ?
main(url='mysql://login:password@localhost/test_DB',
debug='False', repository='.')
File "/usr/lib/python2.4/site-packages/sqlalchemy_migrate-0.7.1-
py2.4.egg/migrate/versioning/shell.py", line 207, in main
ret = command_func(**kwargs)
File "<string>", line 2, in test
File "/usr/lib/python2.4/site-packages/sqlalchemy_migrate-0.7.1-
py2.4.egg/migrate/versioning/util/__init__.py", line 159, in
with_engine
return f(*a, **kw)
File "/usr/lib/python2.4/site-packages/sqlalchemy_migrate-0.7.1-
py2.4.egg/migrate/versioning/api.py", line 219, in test
script.run(engine, 1)
File "/usr/lib/python2.4/site-packages/sqlalchemy_migrate-0.7.1-
py2.4.egg/migrate/versioning/script/py.py", line 145, in run
script_func(engine)
File "/mnt/dev-mahmud/DL/RedIndigo/res/test-migrate/my_respository/
002_migrate.py", line 16, in upgrade
account.columns['newcol'].create()
File "/usr/lib/python2.4/site-packages/SQLAlchemy-0.6.4-py2.4.egg/
sqlalchemy/util.py", line 778, in __getitem__
return self._data[key]
KeyError: 'newcol'
I noticed 'newcol' was missing from the initial table definition.
Adding it gives me the same error.
I have a better formatted version of this in stackoverflow
http://stackoverflow.com/questions/6594471/problems-getting-sql-alchemy-migrate-working-adding-a-column