Postgresql Alembic:使用

Postgresql Alembic:使用,postgresql,sqlalchemy,alembic,Postgresql,Sqlalchemy,Alembic,我正在尝试使用alembic将一个SQLAlchemy PostgreSQL数组(文本)字段转换为我的一个表列的位(variang=True)字段 该列当前定义为: cols = Column(ARRAY(TEXT), nullable=False, index=True) 我想将其更改为: cols = Column(BIT(varying=True), nullable=False, index=True) 默认情况下不支持更改列类型,因此我正在手动编辑alembic脚本。这就是我目前拥

我正在尝试使用alembic将一个SQLAlchemy PostgreSQL数组(文本)字段转换为我的一个表列的位(variang=True)字段

该列当前定义为:

cols = Column(ARRAY(TEXT), nullable=False, index=True)
我想将其更改为:

cols = Column(BIT(varying=True), nullable=False, index=True)
默认情况下不支持更改列类型,因此我正在手动编辑alembic脚本。这就是我目前拥有的:

def upgrade():
    op.alter_column(
        table_name='views',
        column_name='cols',
        nullable=False,
        type_=postgresql.BIT(varying=True)
    )


def downgrade():
    op.alter_column(
        table_name='views',
        column_name='cols',
        nullable=False,
        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>", line 7, 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, multiparams, 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' {}
回溯(最近一次呼叫最后一次):
文件“/home/home/.virtualenvs/deus_lex/bin/alembic”,第9行,在
加载入口点('alembic==0.7.4','console_脚本','alembic')()
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py”,第399行,在main中
命令行(prog=prog).main(argv=argv)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py”,第393行,在main中
self.run_cmd(cfg,选项)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/config.py”,第376行,在run_cmd中
**kwarg中k的dict((k,getattr(options,k)))
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/command.py”,第165行,在升级中
script.run_env()
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/script.py”,第382行,在运行环境中
加载python文件(self.dir,'env.py')
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/util.py”,第242行,在load_python_文件中
模块=加载模块(模块id,路径)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/compat.py”,第79行,加载模块中
mod=imp.load\u源(模块id、路径、fp)
文件“/scripts/env.py”,第83行,在
运行_迁移_联机()
文件“/scripts/env.py”,第76行,在线运行迁移
context.run_migrations()
运行迁移中第7行的文件“”
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/environment.py”,第742行,运行迁移中
self.get_context().运行_迁移(**kw)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/migration.py”,第305行,运行迁移中
步骤.迁移\u fn(**kw)
文件“/home/home/deus_lex/winslow/scripts/versions/2644864bf479_store_caselist_column_views_as_bits.py”,第24行,在升级中
类型=postgresql.BIT(变量=True)
文件“”,第7行,在alter_列中
文件“”,第1行,在
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/util.py”,go中第387行
返回fn(*arg,**kw)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/operations.py”,第470行,在alter_列中
现有自动增量=现有自动增量
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/ddl/impl.py”,第147行,在alter_列中
existing_nullable=existing_nullable,
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/alembic/ddl/impl.py”,第105行,在
return conn.execute(构造、*多内存、**参数)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第729行,在execute中
返回方法(自身、多线程、参数)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/sqlalchemy/sql/ddl.py”,第69行,在连接上执行
返回连接。_执行_ddl(self、multiparams、params)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第783行,在执行ddl中
汇编
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第958行,在执行上下文中
(上下文)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第1159行,在_handle_dbapi_exception中
exc_信息
文件“/home/home/.virtualenvs/deus_-lex/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py”,第199行,源于
重新释放(类型(异常),异常,tb=exc_tb)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第951行,在执行上下文中
(上下文)
文件“/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site packages/sqlalchemy/engine/default.py”,第436行,在do_execute中
cursor.execute(语句、参数)
sqlalchemy.exc.ProgrammingError:(ProgrammingError)列“cols”无法自动转换为类型位变化
提示:指定一个使用表达式来执行转换。
'ALTER TABLE views ALTER cols列类型位变化'{}

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

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

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

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

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

自0.8.8版以来,alembic支持PostgreSQL的
USING
PostgreSQL\u USING
参数:

op.alter_column('views', 'cols', type_=postgresql.BIT(varying=True), postgresql_using='col_name::expr')

+1用于在代码中保留迁移,以便您可以轻松地将数据库的状态复制到其他环境。有关使用
表达式的
的更多提示,目的是告诉postgres如何将当前存储的所有值强制转换为新类型。例如,将一个整数列更改为varchar,您可以使用类似于
col\u name::varchar(32)
的内容。这正是我现在正在寻找的内容。:)这应该是公认的答案。真的不容易找到一个关于postgresql\u的文档使用。。。