我正在尝试使用alembic将sqlAlchemy Postgresql ARRAY(文本)字段转换为我的一个表列的BIT(vary = True)字段。
原文链接:https://www.f2er.com/postgresql/192877.html该列目前定义为:
cols = Column(ARRAY(TEXT),nullable=False,index=True)
我想将其更改为:
cols = Column(BIT(varying=True),index=True)
默认情况下似乎不支持更改列类型,因此我手动编辑alembic脚本。这就是我目前所拥有的:
def upgrade(): op.alter_column( table_name='views',column_name='cols',type_=postgresql.BIT(varying=True) ) def downgrade(): op.alter_column( table_name='views',type_=postgresql.ARRAY(sa.Text()) )
但是,运行此脚本会出现错误:
Traceback (most recent call last): File "/home/home/.virtualenvs/deus_lex/bin/alembic",line 9,in <module> load_entry_point('alembic==0.7.4','console_scripts','alembic')() File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py",line 399,in main CommandLine(prog=prog).main(argv=argv) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py",line 393,in main self.run_cmd(cfg,options) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py",line 376,in run_cmd **dict((k,getattr(options,k)) for k in kwarg) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/command.py",line 165,in upgrade script.run_env() File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/script.py",line 382,in run_env util.load_python_file(self.dir,'env.py') File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/util.py",line 242,in load_python_file module = load_module_py(module_id,path) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/compat.py",line 79,in load_module_py mod = imp.load_source(module_id,path,fp) File "./scripts/env.py",line 83,in <module> run_migrations_online() File "./scripts/env.py",line 76,in run_migrations_online context.run_migrations() File "<string>",line 7,in run_migrations File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/environment.py",line 742,in run_migrations self.get_context().run_migrations(**kw) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/migration.py",line 305,in run_migrations step.migration_fn(**kw) File "/home/home/deus_lex/winslow/scripts/versions/2644864bf479_store_caselist_column_views_as_bits.py",line 24,in upgrade type_=postgresql.BIT(varying=True) File "<string>",in alter_column File "<string>",line 1,in <lambda> File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/util.py",line 387,in go return fn(*arg,**kw) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/operations.py",line 470,in alter_column existing_autoincrement=existing_autoincrement File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/ddl/impl.py",line 147,in alter_column existing_nullable=existing_nullable,File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/ddl/impl.py",line 105,in _exec return conn.execute(construct,*multiparams,**params) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 729,in execute return meth(self,multiparams,params) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py",line 69,in _execute_on_connection return connection._execute_ddl(self,params) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 783,in _execute_ddl compiled File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 958,in _execute_context context) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 1159,in _handle_dbapi_exception exc_info File "/home/home/.virtualenvs/deus_lex/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/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",line 951,in _execute_context context) File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py",line 436,in do_execute cursor.execute(statement,parameters) sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "cols" cannot be cast automatically to type bit varying HINT: Specify a USING expression to perform the conversion. 'ALTER TABLE views ALTER COLUMN cols TYPE BIT VARYING' {}
如何使用USING表达式更改脚本?