gpt4 book ai didi

python - 如何定义表示集合中最新对象的 SQLAlchemy 关系?

转载 作者:太空狗 更新时间:2023-10-30 02:35:36 25 4
gpt4 key购买 nike

我有一个 SQLAlchemy 模型,表 x 和表 y 之间存在一对多关系。表 yid 最大的记录(如果有),其中 y.x_id = x.id 是特殊的。类 X 和类 Y 映射表 xy

我知道如何定义 X.all_y (ORDER BY y.id)。如何定义等同于 X.all_y[-1]X.latest_y

最佳答案

纯粹的关系方法需要使用子查询来获取“最新”或“最大”值,与父项相关,然后将其与集合的成员等同起来。这意味着如果您在确定“最新”的列上放置索引,您将获得最佳结果:

from sqlalchemy import *
from sqlalchemy.orm import *

engine = create_engine('sqlite:///:memory:', echo='debug')

m = MetaData()

parent = Table('parent', m,
Column('id', Integer, primary_key=True)
)

child = Table('child', m,
Column('id', Integer, primary_key=True),
Column('parent_id', Integer, ForeignKey('parent.id')),
Column('sortkey', Integer)
)

m.create_all(engine)

class Parent(object):
def __init__(self, children):
self.all_c = children

class Child(object):
def __init__(self, sortkey):
self.sortkey = sortkey

latest_c = select([func.max(child.c.sortkey)]).\
where(child.c.parent_id==parent.c.id).\
correlate(parent).\
as_scalar()

mapper(Parent, parent, properties={
'all_c':relation(Child),
'latest_c':relation(Child,
primaryjoin=and_(
child.c.sortkey==latest_c,
child.c.parent_id==parent.c.id
),
uselist=False
)
})

mapper(Child, child)

session = sessionmaker(engine)()

p1, p2, p3 = Parent([Child('a'), Child('b'), Child('c')]), \
Parent([Child('b'), Child('c')]),\
Parent([Child('f'), Child('g'), Child('c')])

session.add_all([p1, p2, p3])
session.commit()

assert p1.latest_c.sortkey == 'c'
assert p2.latest_c.sortkey == 'c'
assert p3.latest_c.sortkey == 'g'

或者,您可以在某些平台上使用 LIMIT,这可以产生更快的结果,因为您可以避免聚合并可以在其主键上加入集合项:

latest_c = select([child.c.id]).\
where(child.c.parent_id==parent.c.id).\
order_by(child.c.sortkey.desc()).\
limit(1).\
correlate(parent).\
as_scalar()

mapper(Parent, parent, properties={
'all_c':relation(Child),
'latest_c':relation(Child,
primaryjoin=and_(
child.c.id==latest_c,
child.c.parent_id==parent.c.id
),
uselist=False
)
})

关于python - 如何定义表示集合中最新对象的 SQLAlchemy 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com