【问题标题】:Flask SQLAlchemy reverse inclusion a many to many queryFlask SQLAlchemy 反向包含多对多查询
【发布时间】:2021-02-13 21:44:30
【问题描述】:

我对 SQLAlchemy 很陌生。 对于这个项目,我使用的是烧瓶和 sqlalchemy。

我需要做的其中一条路线是将用户添加到某个组。所以我需要创建一个不包含在该组中的用户列表。

我做了一个 SQL 语句并在我的数据库中尝试了它,这给了我需要的结果,我只是不擅长将它转换为 SQLAlchemy

select id, email from users where id not in ( select user_id from user_group where group_id = 1);

我的模型看起来像这样

UserGroup = db.Table(
    "user_group",
    db.Model.metadata,
    db.Column("user_id", db.Integer, db.ForeignKey("users.id")),
    db.Column("group_id", db.Integer, db.ForeignKey("groups.id")),
)
    
class Group(db.Model, RestrictionsMixin):
    __tablename__ = "groups"
    __versioned__ = {}
    __restrictions__ = {}

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False, unique=True)

class User(db.Model):
    __tablename__ = "users"
    __versioned__ = {}

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(250), unique=True, nullable=False)
    _password = db.Column(db.LargeBinary(60), nullable=False)
    authenticated = db.Column(db.Boolean, default=False)
    active = db.Column(db.Boolean, default=True, nullable=False)
    email_confirmation_sent_on = db.Column(db.DateTime, nullable=True)
    email_confirmed = db.Column(db.Boolean, nullable=True, default=False)
    email_confirmed_on = db.Column(db.DateTime, nullable=True)
    registered_on = db.Column(db.DateTime, nullable=True)
    last_logged_in = db.Column(db.DateTime, nullable=True)

    groups = db.relationship("Group", secondary="user_group", backref="users")

【问题讨论】:

    标签: flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    你可以这样做:

    user_group_subquery = (
        db.session.query(UserGroup.c.user_id).filter(UserGroup.c.group_id == 1).subquery()
    )
    db.session.query(User.id, User.email).filter(~User.id.in_(user_group_subquery))
    

    The tilde (~) returns the negation of a clause.

    【讨论】:

    • 感谢 Bas,我已将解决方案更改为您的解决方案。在过去的几天里,我一直在阅读整个 SQLAlchemy 文档以了解它的各个方面。我发现了一个基本上使用db.session.query(User).from_statement(text("select * from users where id not in (select user_id from user_group where group_id = :group)") ).params(group=id).all() 的小工作,还有一些文档要查看。感谢您的解决方案。
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 2012-09-17
    • 2014-03-28
    • 2014-05-18
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多