考虑以下SQLAlchemy代码
class Foo(Base):
__tablename__ = 'currency'
id = Column(Integer, primary_key=True)
name = Column(String(40), nullable=False, unique=True)
symbol = Column(String(4), nullable=False, unique=True)
l = session.query(Foo.symbol, Foo.id).all()
在最后一行中,我试图生成符号ID对的列表。它会产生以下错误:
NameError:名称'Foo'未定义
我尝试了以下操作并得到了指定的错误:
l = session.query(models.Foo.symbol, models.Foo.id).all()
#note: The Foo object is in the models.py file
#error: NameError: name 'models' is not defined
l = session.query(symbol, id).all()
#error: sqlalchemy.exc.CompileError: Cannot compile Column object until its 'name' is assigned.
l = session.query(self.symbol, self.id).all()
#error: NameError: name 'self' is not defined
那么如何从Foo类内部将Foo对象的列名传递给SqlAlhemy查询呢?
为什么我这样做?然后我将列表转换为字典,并且只能从整个程序中的代码访问字典,因为它的值很少被更改。所以我想填充一次,然后多次访问它而不再次访问数据库。而且我希望将它保留在我认为属于它的Foo类中。
如果有更好的方法,请告诉我。
答案 0 :(得分:1)
在定义之前,不能使用该类。即使可以从类块本身中正确解析名称,也不能使用symbol
和id
,,因为ORM没有机会准备列。这是声明式Base
的任务之一,Foo
将继承需要准备模型的元类。
假设您正确设置了会话,您应该能够在类定义块的外类上动态提供此属性:
class Foo(Base):
__tablename__ = 'currency'
id = Column(Integer, primary_key=True)
name = Column(String(40), nullable=False, unique=True)
symbol = Column(String(4), nullable=False, unique=True)
Foo.l = session.query(Foo.symbol, Foo.id).all()