如何从Python

时间:2018-02-23 00:16:11

标签: python sqlalchemy

考虑以下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类中。

如果有更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:1)

在定义之前,不能使用该类。即使可以从类块本身中正确解析名称,也不能使用symbolid,因为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()