我正在为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
类的构造函数,但它与拐杖非常相似。
答案 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,直到填充列名称为止