如何在子类中使用变量在SQLAlchemy中的基类中创建序列

时间:2017-06-22 04:48:51

标签: python sqlalchemy

我的课程定义如下

class RelationshipType(Type):
   __tablename__ = "relationship_type"
   __sequencename__ = "rel_type_seq"

当我将子类定义为

File "/home/vagrant/env/flask_files_api/local/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 2880, in _requires_quotes
  lc_value = value.lower()
AttributeError: 'NoneType' object has no attribute 'lower'`

我收到错误。

__sequencename__

如何让父类使用子类中定义的project/ ├── old-architecture/ <-- PEAR Code style └── new-architecture/ <-- PSR 1 and PSR 2 code style ?我需要序列名称,因为我在子类

中定义它

1 个答案:

答案 0 :(得分:2)

你要找的是@declared_attr装饰者:

from sqlalchemy.ext.declarative import declared_attr

class Type(Base):
    ...
    @declared_attr
    def id(cls):
        return Column(SmallInteger,
                      Sequence(cls.__sequencename__),
                      primary_key=True)

这样,您可以将列的实际创建推迟到定义子类时:

  

@declared_attr将属性转换为类似于标量的属性,可以从未实例化的类中调用。声明性将特定标记为@declared_attr的属性视为返回特定于映射或声明性表配置的构造。属性的名称是属性的非动态版本的名称。

现在,如果不是using Oracle,手动定义序列对我的理解大多是不必要的。您只需将autoincrement=True添加到主键列,或将其保留在default value of "auto"

  

默认值是字符串"auto",表示没有声明客户端或python端默认值的INTEGER类型的单列主键应自动接收自动增量语义