您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – SQLAlchemy:排除从查询中的子查询中获取的行

5b51 2022/1/14 8:23:35 python 字数 4493 阅读 617 来源 www.jb51.cc/python

抽象我的问题,我有2 tables.一个用户表和一个友谊表.我正在尝试使用SQLAlchemy列出所有可以作为朋友添加到User 1,Alice以及排除自己的用户的查询.考虑到可能有很多友谊,找到爱丽丝的朋友:friend_subquery = db.session.query(Friendship).filter_by(User_id=1).subquer

概述

抽象我的问题,我有2 tables.一个用户表和一个友谊表.

我正在尝试使用sqlAlchemy列出所有可以作为朋友添加到User 1,Alice以及排除自己的用户查询.

考虑到可能有很多友谊,找到爱丽丝的朋友:

friend_subquery = db.session.query(Friendship).filter_by(User_id=1).subquery()

现在我想要列出所有用户,除了Alice和她的朋友Bob和Jack.

friends = (db.session.query(User).
            filter(User.ID != 1).
            outerjoin(friend_subquery,User.ID != friend_subquery.c.Friend_id))

我的预期结果是获得用户4和5,但这个查询
返回除Alice自己以外的所有人的条件

User.ID != friend_subquery.c.Friend_id

似乎没有像预期的那样工作.

附:我已经完成了搜索,阅读文档的作业,但无法弄明白.谢谢你的时间.

class User(db.Model):
    __tablename__ = 'User'

    ID = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(100))

    friendships = db.relationship(
        'Friendship',foreign_keys='Friendship.User_id',backref='friender',)
    friendships_of = db.relationship(
        'Friendship',foreign_keys='Friendship.Friend_id',backref='friendee',)


class Friendship(db.Model):
    __tablename__ = 'Friendship'
    ID = db.Column(db.Integer,primary_key=True)
    User_id = db.Column(db.Integer,db.ForeignKey('User.ID'))
    Friend_id = db.Column(db.Integer,db.ForeignKey('User.ID'))

在这种情况下,执行此查询的两种方法显示在下面的代码中.第一个查询依赖于User.friendships_of的关系,而第二个查询使用显式连接:

    # Add users
    u1,u2,u3,u4,u5 = users = [
        User(name="Alice"),User(name="Bob"),User(name="Jack"),User(name="Pluto"),User(name="Mike"),]
    db.session.add_all(users)

    # Add friendhips
    u1.friendships.append(Friendship(friendee=u2))
    u1.friendships.append(Friendship(friendee=u3))
    db.session.commit()

    # Find Alice
    u_alice = db.session.query(User).filter(User.name == 'Alice').one()

    # Query (version 1)
    q = (
        db.session.query(User)
        .filter(~User.friendships_of.any(Friendship.User_id == u_alice.ID))
        .filter(User.ID != u_alice.ID)
        .all()
    )
    for x in q:
        print(x)

    # Query (version 2)
    q = (
        db.session.query(User)
        .outerjoin(
            Friendship,db.and_(
                u_alice.ID == Friendship.User_id,User.ID == Friendship.Friend_id,)
        )
        .filter(Friendship.ID == None)
        .filter(User.ID != u_alice.ID)
        .all()
    )
    for x in q:
        print(x)

总结

以上是编程之家为你收集整理的python – SQLAlchemy:排除从查询中的子查询中获取的行全部内容,希望文章能够帮你解决python – SQLAlchemy:排除从查询中的子查询中获取的行所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶