为什么属性名称' sqlalchemy.Column实例的消失?

时间:2017-06-14 13:28:17

标签: python sqlalchemy

我正在为sqlalchemy模型编写属性更改的历史记录。属性列表,对历史很重要,我保留在类属性history_attributes中。

from sqlalchemy import Integer, Column, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class HistoryAttribute:
    def __init__(self, descriptor, display_name, use_message=False):
        self.name = descriptor.name
        self.display_name = display_name
        self.use_message = use_message
class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    first_name = Column(String(100))
    email = Column(String(100))
    history_attributes = (
        HistoryAttribute(descriptor=first_name, display_name='User name'),
        email
    )

print(User.history_attributes[0].name)
>>> None
print(User.history_attributes[1].name)
>>> email

为什么"name"实例的属性Column会消失,如果我将其传递给其他类的构造函数?当然,我可以写first_name = Column('first_name', String(100)并且代码可以正常工作, 但我不想明确添加Column.name。我使用了namedtuple避免了这个问题,然后我将其传递给HistoryAttribute类的构造函数,但它与拐杖非常相似。

2 个答案:

答案 0 :(得分:3)

name属性不是消失了,而是尚未初始化。查看传递给first_name的{​​{1}}的值:HistoryAttribute;它不包含任何字符串Column(String(100))。 SQLAlchemy将在定义类之后填写名称。

答案 1 :(得分:1)

如前所述,问题是在构建类时设置了first_name.name。 SQLAlchemy确实有一种机制,用于将属性定义推迟到配置时间。尝试类似的东西     class User(Base):         #...         @ sqlalchemy.ext.declarative.api.declared_attr         def history_attributes(self):             return(HistoryAttribute(self.first_name#...))

这将推迟构建history_attributes,直到填充列名称为止