【问题标题】:SQLAlchemy column with enum using PEP 435 compliant enum produces table creation error具有使用 PEP 435 兼容枚举的枚举的 SQLAlchemy 列会产生表创建错误
【发布时间】:2016-08-29 22:00:40
【问题描述】:

我有一个枚举...定义与here 非常相似。

当我尝试使用枚举创建表时,如示例中所示,在创建表期间出现错误。这是一个非常模糊的错误。这是复制问题的代码:

from sqlalchemy import Table, MetaData, Column, Enum, create_engine
import enum
class myEnum(enum.Enum):
    one = 'one'
    two = 'two'
    three = 'three'

def main():
    e = create_engine('sqlite:///:memory:')
    e.echo = True
    m = MetaData(bind = e)
    t = Table('table', m, Column('my_enum', Enum(myEnum)))
    t.create()
if __name__ == '__main__': main()

当我运行这段代码时,我得到了一个AttributeError: replace,它带有一个看似无用的堆栈跟踪。老实说,我什至不知道从哪里开始调试它,虽然我可以设想几个可能的解决方法,但我对 SQLAlchemy 相对较新,所以我不确定最干净的解决方案是什么。基本的枚举支持肯定是对 ORM 框架的一个相对简单的期望吗?

这是完整的堆栈跟踪:

Traceback (most recent call last):
  File "table_test.py", line 17, in <module>
    if __name__ == '__main__': main()
  File "table_test.py", line 16, in main
    t.create()
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\schema.py", line 725, in create
    checkfirst=checkfirst)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1856, in _run_visitor
    conn._run_visitor(visitorcallable, element, **kwargs)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1481, in _run_visitor
    **kwargs).traverse_single(element)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\visitors.py", line 121, in traverse_single
    return meth(obj, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\ddl.py", line 764, in visit_table
    include_foreign_key_constraints=include_foreign_key_constraints
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 914, in execute
    return meth(self, multiparams, params)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\ddl.py", line 68, in _execute_on_connection
    return connection._execute_ddl(self, multiparams, params)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 962, in _execute_ddl
    compiled = ddl.compile(dialect=dialect)
  File "<string>", line 1, in <lambda>
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 494, in compile
    return self._compiler(dialect, bind=bind, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\ddl.py", line 26, in _compiler
    return dialect.ddl_compiler(dialect, self, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 190, in __init__
    self.string = self.process(self.statement, **compile_kwargs)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 213, in process
    return obj._compiler_dispatch(self, **kwargs)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\visitors.py", line 81, in _compiler_dispatch
    return meth(self, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 2173, in visit_create_table
    create.include_foreign_key_constraints)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 2220, in create_table_constraints
    for constraint in constraints
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 2218, in <genexpr>
    p for p in
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 2226, in <genexpr>
    not getattr(constraint, 'use_alter', False)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 213, in process
    return obj._compiler_dispatch(self, **kwargs)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\visitors.py", line 93, in _compiler_dispatch
    return meth(self, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 2369, in visit_check_constraint
    literal_binds=True)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 213, in process
    return obj._compiler_dispatch(self, **kwargs)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\visitors.py", line 81, in _compiler_dispatch
    return meth(self, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 927, in visit_binary
    return self._generate_generic_binary(binary, opstring, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 944, in _generate_generic_binary
    binary.right._compiler_dispatch(self, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\visitors.py", line 81, in _compiler_dispatch
    return meth(self, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 527, in visit_grouping
    return "(" + grouping.element._compiler_dispatch(self, **kwargs) + ")"
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\visitors.py", line 81, in _compiler_dispatch
    return meth(self, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 751, in visit_clauselist
    for c in clauselist.clauses)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 748, in <genexpr>
    s for s in
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 751, in <genexpr>
    for c in clauselist.clauses)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\visitors.py", line 81, in _compiler_dispatch
    return meth(self, **kw)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 1071, in visit_bindparam
    bindparam, within_columns_clause=True, **kwargs)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 1103, in render_literal_bindparam
    return self.render_literal_value(value, bindparam.type)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\compiler.py", line 1118, in render_literal_value
    return processor(value)
  File "C:\Anaconda3\lib\site-packages\sqlalchemy\sql\sqltypes.py", line 171, in process
    value = value.replace("'", "''")
  File "C:\Anaconda3\lib\enum.py", line 268, in __getattr__
    raise AttributeError(name) from None
AttributeError: replace

【问题讨论】:

  • 什么版本的 SQLAlchemy?你能发布完整的堆栈跟踪吗?
  • 版本 1.0.13... 我将立即使用完整的堆栈跟踪更新原始帖子。
  • PEP-435 enum support 在 1.1 中添加(目前处于测试阶段)。
  • @univerio:你应该回答这个问题。也许添加预期的发布日期?

标签: python orm enums sqlalchemy


【解决方案1】:

PEP-435 enum support 正在 1.1 中添加。

1.1.0b1 最近发布了。您可以升级到 1.1.0b1,但要小心错误。根据发布历史,我会说稳定版应该在一两个月内发布。

如何升级:

pip install 'sqlalchemy==1.1.0b3'

【讨论】:

  • 啊,谢谢。当开发人员将文档的“最新”版本升级到实际未正式发布的版本时,这会有点烦人。
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
相关资源
最近更新 更多