postgresql – Alembic:alter column type

我试图使用alembic将sqlAlchemy Postgresql ARRAY(Text)字段转换为我的一个表列的BIT(vary = True)字段.

该列目前定义为:

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表达式更改我的脚本?

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

但是,为此编写自定义sql是非常容易的:

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

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

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...