【发布时间】:2016-03-16 04:38:27
【问题描述】:
我正在尝试从 SQLAlchemy 中的多个连接表中加载列的子集,但无法弄清楚神奇的语法。
这是我正在尝试做的一个简单示例。它会导致错误(如下):
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, load_only
Base = declarative_base()
class Table1(Base):
__tablename__ = 'table1'
table1_id = Column(Integer, primary_key=True)
table1_val = Column(String)
r1 = relationship('Table2', backref = 'r2')
class Table2(Base):
__tablename__ = 'table2'
table2_id = Column(Integer, ForeignKey('table1.table1_id'), primary_key=True)
table2_val = Column(String)
from sqlalchemy.orm import sessionmaker
some_engine = create_engine('postgresql://scott:tiger@localhost/')
Session = sessionmaker(bind=some_engine)
session = Session()
query = session.query(Table1).join(Table2).options(load_only('table1_val','table2_val'))
ArgumentError: Can't find property named 'table2_val' on the mapped entity Mapper|Table1|table1 in this Query.
如何从这些多个表中挑选列?
【问题讨论】:
-
您是否尝试过使用
Table1.table1_val属性对象,而不仅仅是字符串名称?我希望 SQLAlchemy 在这里需要一个限定名称,因为原则上两个表都可以有重叠的列名。 -
产生不同的错误:
query = session.query(Table1).join(Table2).options(load_only(Table1.table1_val,Table2.table2_val))ArgumentError: Can't find property 'table2_val' on any entity specified in this Query. Note the full path from root (Mapper|Table1|table1) to target entity must be specified. -
另一个变体,另一个错误:
query = session.query(Table1,Table2).options(load_only(Table1.table1_val,Table2.table2_val))通配符加载器只能用于一个实体。使用 Load(ent) 指定特定实体。 -
我也尝试过
Load()路由,它不会抛出任何错误,但只加载Table1 中的列,完全忽略Table2 的指定列:query = session.query(Table1).join(Table2).options(Load(Table1).load_only(Table1.table1_val),Load(Table2).load_only(Table2.table2_val)) -
文档 (docs.sqlalchemy.org/en/latest/orm/…) 说这种情况下的语法是
session.query(Table1, Table2).join(Table2).options(Load(Table1).load_only('table1_val'), Load(Table2).load_only('table2_val'))。如果这不起作用,那至少是一个文档错误。
标签: python sqlalchemy