postgresql – Alembic:使用USING改变列类型

前端之家收集整理的这篇文章主要介绍了postgresql – Alembic:使用USING改变列类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用alembic将sqlAlchemy Postgresql ARRAY(文本)字段转换为我的一个表列的BIT(vary = True)字段。

该列目前定义为:

  1. cols = Column(ARRAY(TEXT),nullable=False,index=True)

我想将其更改为:

  1. cols = Column(BIT(varying=True),index=True)

默认情况下似乎不支持更改列类型,因此我手动编辑alembic脚本。这就是我目前所拥有的:

  1. def upgrade():
  2. op.alter_column(
  3. table_name='views',column_name='cols',type_=postgresql.BIT(varying=True)
  4. )
  5.  
  6.  
  7. def downgrade():
  8. op.alter_column(
  9. table_name='views',type_=postgresql.ARRAY(sa.Text())
  10. )

但是,运行此脚本会出现错误

  1. Traceback (most recent call last):
  2. File "/home/home/.virtualenvs/deus_lex/bin/alembic",line 9,in <module>
  3. load_entry_point('alembic==0.7.4','console_scripts','alembic')()
  4. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py",line 399,in main
  5. CommandLine(prog=prog).main(argv=argv)
  6. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py",line 393,in main
  7. self.run_cmd(cfg,options)
  8. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py",line 376,in run_cmd
  9. **dict((k,getattr(options,k)) for k in kwarg)
  10. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/command.py",line 165,in upgrade
  11. script.run_env()
  12. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/script.py",line 382,in run_env
  13. util.load_python_file(self.dir,'env.py')
  14. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/util.py",line 242,in load_python_file
  15. module = load_module_py(module_id,path)
  16. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/compat.py",line 79,in load_module_py
  17. mod = imp.load_source(module_id,path,fp)
  18. File "./scripts/env.py",line 83,in <module>
  19. run_migrations_online()
  20. File "./scripts/env.py",line 76,in run_migrations_online
  21. context.run_migrations()
  22. File "<string>",line 7,in run_migrations
  23. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/environment.py",line 742,in run_migrations
  24. self.get_context().run_migrations(**kw)
  25. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/migration.py",line 305,in run_migrations
  26. step.migration_fn(**kw)
  27. File "/home/home/deus_lex/winslow/scripts/versions/2644864bf479_store_caselist_column_views_as_bits.py",line 24,in upgrade
  28. type_=postgresql.BIT(varying=True)
  29. File "<string>",in alter_column
  30. File "<string>",line 1,in <lambda>
  31. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/util.py",line 387,in go
  32. return fn(*arg,**kw)
  33. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/operations.py",line 470,in alter_column
  34. existing_autoincrement=existing_autoincrement
  35. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/ddl/impl.py",line 147,in alter_column
  36. existing_nullable=existing_nullable,File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/ddl/impl.py",line 105,in _exec
  37. return conn.execute(construct,*multiparams,**params)
  38. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 729,in execute
  39. return meth(self,multiparams,params)
  40. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py",line 69,in _execute_on_connection
  41. return connection._execute_ddl(self,params)
  42. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 783,in _execute_ddl
  43. compiled
  44. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 958,in _execute_context
  45. context)
  46. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 1159,in _handle_dbapi_exception
  47. exc_info
  48. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py",line 199,in raise_from_cause
  49. reraise(type(exception),exception,tb=exc_tb)
  50. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 951,in _execute_context
  51. context)
  52. File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py",line 436,in do_execute
  53. cursor.execute(statement,parameters)
  54. sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "cols" cannot be cast automatically to type bit varying
  55. HINT: Specify a USING expression to perform the conversion.
  56. 'ALTER TABLE views ALTER COLUMN cols TYPE BIT VARYING' {}

如何使用USING表达式更改脚本?

不幸的是,您需要使用原始sql,因为在更改类型时,alembic不会输出USING语句。

但是,为此编写自定义sql非常简单:

  1. op.execute('ALTER TABLE views ALTER COLUMN cols TYPE bit varying USING expr')

当然,您必须将expr替换为将旧数据类型转换为新数据类型的表达式。

猜你在找的Postgre SQL相关文章