1

SQLAlchemy を使用して postgres テーブルにアクセスします。クエリにeagerloadingが必要です。

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()

これは AttributeError: 'ColumnProperty' object has no attribute 'mapper' で失敗します

eagerloading のないものは、レコードを正しく返します。

私はSQLAlchemyが初めてです。何が問題なのかわかりません。ポインタはありますか?

4

1 に答える 1

2

リレーション プロパティでのみ熱心にロードできます。テーブル自体にはありません。一括読み込みは、特定のオブジェクトを取得すると同時に、他のテーブルからオブジェクトを読み込むことを目的としています。クエリのすべてのオブジェクトをロードする方法は、all() を追加するだけです。

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

クエリはテーブル内のすべてのオブジェクト (行) のリストになり、len(query) はカウントを返します。

于 2009-08-14T20:19:18.083 に答える