SQLAlchemy - 尝试预加载.. 属性错误

1 投票
1 回答
4244 浏览
提问于 2025-04-15 13:36

我正在使用SQLAlchemy访问一个Postgres数据库的表。我想要一个查询能够进行预加载。

from sqlalchemy.orm import sessionmaker, scoped_session, eagerload
from settings import DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, Boolean, MetaData, ForeignKey
from sqlalchemy.orm import mapper
from sqlalchemy.ext.declarative import declarative_base

def create_session():
  engine = create_engine('postgres://%s:%s@%s:%s/%s' % (DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME), echo=True)
  Session = scoped_session(sessionmaker(bind=engine))
  return Session()

Base = declarative_base()
class Zipcode(Base):
  __tablename__ = 'zipcode'
  zipcode = Column(String(6), primary_key = True, nullable=False)
  city = Column(String(30), nullable=False)
  state = Column(String(30), nullable=False)

session = create_session()
query = session.query(Zipcode).options(eagerload('zipcode')).filter(Zipcode.state.in_(['NH', 'ME']))
#query = session.query(Zipcode.zipcode).filter(Zipcode.state.in_(['NH', 'ME']))
print query.count()

但是这样做会出错,提示信息是:'ColumnProperty'对象没有'mapper'这个属性。

如果不使用预加载,查询可以正确返回记录。

我对SQLAlchemy还很陌生,不太清楚问题出在哪里。有没有什么建议?

1 个回答

2

你只能在关系属性上使用预加载,而不能直接在表上使用。预加载的意思是同时从其他表中加载对象,这样在获取某个特定对象时,可以一起把相关的数据也加载进来。要加载查询的所有对象,你只需要加上 all() 就可以了。

query = session.query(Zipcode).options(eagerload('zipcode')).filter(Zipcode.state.in_(['NH', 'ME'])).all()

这样查询的结果就会是表中所有对象(行)的列表,而 len(query) 可以告诉你有多少个对象。

撰写回答