gpt4 book ai didi

sql - 带有父子的嵌套 sqlalchemy 过滤器

转载 作者:行者123 更新时间:2023-11-29 14:21:34 32 4
gpt4 key购买 nike

采用以下方案:

class User(Base):
id = Column(Integer, primary_key=True)
name = Column(String)

class Photo(Base):
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey(User.id), nullable=False)
user = relationship(User)

class Tag(Base):
id = Column(Integer, primary_key=True)
tag_name = Column(String)
tag_version = Column(Integer)
photo_id = Column(Integer, ForeignKey(Photo.id), nullable=False)
photo = relationship(Photo)

如何创建 SQLAlchemy 查询以获取特定用户的所有照片,这些照片没有特定的标签和版本。

“用户 ID 为“1234”但没有标记版本“2”的“猫”的所有照片”

同样有趣的是“所有至少拥有一张照片但没有特定标签的用户”

顺便说一句,我正在使用 postgreSQL。

最佳答案

这是一个完整的示例,它设置关系、创建一些示例数据,然后执行您的两个查询。

设置:

from datetime import datetime
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, not_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship

engine = create_engine('sqlite:///', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(bind=engine)


class User(Base):
__tablename__ = 'user'

id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)


class Photo(Base):
__tablename__ = 'photo'

id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey(User.id), nullable=False)

user = relationship(User, backref='photos')


class Tag(Base):
__tablename__ = 'tag'

id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
photo_id = Column(Integer, ForeignKey(Photo.id), nullable=False)

photo = relationship(Photo, backref='tags')


Base.metadata.create_all()
session.add(User(name='davidism', photos=[
Photo(name='sun', tags=[Tag(name='bright'), Tag(name='day')]),
Photo(name='moon', tags=[Tag(name='bright'), Tag(name='night')])
]))
session.add(User(name='eran', photos=[
Photo(name='party', tags=[Tag(name='people'), Tag(name='night')]),
Photo(name='cat')
]))
session.commit()

查询所有没有标签的照片:

no_tags = session.query(Photo).outerjoin(Photo.tags).filter(not_(Photo.tags.any())).all()
print 'no tags: ', len(no_tags)

查询所有没有标签'night'的照片:

not_night = session.query(Photo).outerjoin(Photo.tags).filter(not_(Photo.tags.any(Tag.name == 'night'))).all()
print 'not night: ', len(not_night)

关于sql - 带有父子的嵌套 sqlalchemy 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23999367/

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