2015-01-25 7 views
1

파일 시스템과 sqlalchemy를 기반으로하는 기존 프로젝트가 있습니다. 나는이 프로젝트에서 alembic이나 wrapper를 사용하지 않았다.은 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