0

これが奇妙な質問である場合は申し訳ありません。sqlalchemy サイトのドキュメント/チュートリアルを調べましたが、この特定のクエリを実行する方法がわかりません。

私のサイトには、変更されるまで続くアクティビティの日付がたくさんあります。特定の日付または日付の範囲を照会できることはわかっていますが、(存在しない) 日付を照会すると、以前の一致を取得できますか?

たとえば、6 月 25 日と 6 月 30 日の 2 つの日付がある場合、6 月 29 日のクエリを実行します。1 つのクエリだけで 6 月 25 日のデータを取得することは可能ですか? 入力した日付の前の一致が必要です。

4

1 に答える 1

1

以下はおそらくモデルの単純化されたバージョンですが、この例が独自のクエリを作成するのに役立つことを願っています.

モデルが以下のように定義され、[Activity.person_id, Activity.date]が一意である (基本的に、1 日に 1 つのアクティビティのみが許可される) と仮定すると、クエリはサブクエリを使用して tuples を返します(Person, _last_ Activity)

# MODEL:
class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String)
    activities = relationship('Activity', backref="person")

class Activity(Base):
    __tablename__ = 'activity'
    id = Column(Integer, primary_key=True, autoincrement=True)
    person_id = Column(Integer, ForeignKey('person.id'))
    name = Column(String)
    date = Column(Date)


# BUILDING THE QUERY
def get_latest_activity_before_or_at(last_date):
    AT = Activity.__table__
    q = (select([AT.c.person_id, func.max(AT.c.date).label("max_date")],
                (AT.c.date <= last_date)
                ).
            group_by(AT.c.person_id)).alias("subq")
    #print q

    #qry = session.query(Person, q).outerjoin(q, q.c.person_id == Person.id)
    qry = (session.query(Person).outerjoin(q, q.c.person_id == Person.id).
            outerjoin(Activity, and_(Activity.person_id == Person.id, Activity.date == q.c.max_date)))
    qry = qry.add_entity(Activity)
    return qry.all()

# TESTING the query:
last_date = datetime.date(2012, 7, 3)
res = get_latest_activity_before_or_at(last_date)
for x in res:
    print x
于 2012-07-30T14:30:56.693 に答える