2015-01-25 3 views
1

У меня есть существующий проект, основанный на пилонах и sqlalchemy. Я еще не использовал alembic или любую обертку в этом проекте.не может переименовать столбец, используя alter_column

Я перенес проект в колбу и sqlalchemy. Я взял старую базу данных старой версии 1.5 и сгенерировал первый скрипт миграции с помощью Flast-Migrate. Хм, я понял, что мне придется делать много вещей вручную.

Я уже застреваю при переименовании столбцов. Я делаю это с базой данных SQLite.

В старом проекте был стол «Токен», который был переименован в «токен». Очевидно, что есть база данных, которая не заботится о верхнем или нижнем регистре. Когда я пытаюсь переименовать первый столбец, как это:

op.alter_column('token', 'privacyIDEATokenId', new_column_name='id') 

Я получаю эту ошибку:

sqlalchemy.exc.OperationalError: (OperationalError) near \ 
""privacyIDEATokenId"": syntax error u'ALTER TABLE token RENAME \ 
"privacyIDEATokenId" TO id'() 

Столбец Token.privacyIDEATokenId является первичным ключом, который должен быть token.id в новой версии , То же самое происходит с столбцами, которые не являются первичным ключом.

Полный след:

Traceback (most recent call last): 
    File "./manage.py", line 107, in <module> 
    manager.run() 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run 
    result = self.handle(sys.argv[0], sys.argv[1:]) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle 
    res = handle(*args, **config) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/flask_script/commands.py", line 216, in __call__ 
    return self.run(*args, **kwargs) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/flask_migrate/__init__.py", line 98, in upgrade 
    command.upgrade(config, revision, sql = sql, tag = tag) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/command.py", line 129, in upgrade 
    script.run_env() 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/script.py", line 208, in run_env 
    util.load_python_file(self.dir, 'env.py') 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/util.py", line 230, in load_python_file 
    module = load_module_py(module_id, path) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/compat.py", line 63, in load_module_py 
    mod = imp.load_source(module_id, path, fp) 
    File "migrations/env.py", line 72, in <module> 
    run_migrations_online() 
    File "migrations/env.py", line 65, in run_migrations_online 
    context.run_migrations() 
    File "<string>", line 7, in run_migrations 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/environment.py", line 696, in run_migrations 
    self.get_context().run_migrations(**kw) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/migration.py", line 266, in run_migrations 
    change(**kw) 
    File "migrations/versions/112475c7f45_.py", line 103, in upgrade 
    _upgrade_token_table() 
    File "migrations/versions/112475c7f45_.py", line 49, in _upgrade_token_table 
    op.alter_column('token', 'privacyIDEATokenId', new_column_name='id') 
    File "<string>", line 7, in alter_column 
    File "<string>", line 1, in <lambda> 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/util.py", line 353, in go 
    return fn(*arg, **kw) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/operations.py", line 329, in alter_column 
    existing_autoincrement=existing_autoincrement 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/ddl/impl.py", line 131, in alter_column 
    existing_nullable=existing_nullable, 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/alembic/ddl/impl.py", line 81, in _exec 
    conn.execute(construct, *multiparams, **params) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 729, in execute 
    return meth(self, multiparams, params) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 69, in _execute_on_connection 
    return connection._execute_ddl(self, multiparams, params) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 783, in _execute_ddl 
    compiled 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 958, in _execute_context 
    context) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1159, in _handle_dbapi_exception 
    exc_info 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause 
    reraise(type(exception), exception, tb=exc_tb) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 951, in _execute_context 
    context) 
    File "/home/cornelius/src/privacyidea/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 436, in do_execute 
    cursor.execute(statement, parameters) 
sqlalchemy.exc.OperationalError: (OperationalError) near ""privacyIDEATokenId"": syntax error u'ALTER TABLE token RENAME "privacyIDEATokenId" TO id'() 

ответ

5

Obivously SQLite не может переименовать столбец. Итак, наконец, я закончил создание новых таблиц с новыми столбцами и перетаскивание данных из одного в другое.

Это нормально, так как я понял, что я должен также манипулировать данными, адаптировать и модифицировать их перед тем, как снова писать в новый стол.

Сценарий я закончил с, здесь: https://github.com/privacyidea/privacyidea/blob/version2/migrations/versions/4f32a4e1bf33_.py#L241

+0

Ну, это колоссальная боль в спине. Это не было отрицательным, упомянутым мной при оценке того, стоит ли использовать SQLite или нет. – freethebees