什么是SQLAlchemy查询,用于从多对多关系中的两个表创建关联?

2024-10-01 09:39:46 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我已经进入了我的头,一直在努力使这一权利的一天左右,现在试图创建一个简单的网络应用程序

我创建了两个类,如下所示(User和RaidItem)。我的目的是让任意数量的用户拥有RaidItem的“所有权”。在我的研究中,我发现需要一个关联表,并创建了如下所示的表

    association_table = db.Table('association',
                        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
                        db.Column('raiditem_id', db.Integer(), db.ForeignKey('raid_item.id')))

    class User(db.Model, UserMixin):
        id = db.Column(db.Integer(), primary_key=True)
        items = db.relationship('RaidItem', secondary=association_table, backref = db.backref('owner'), lazy='dynamic')

    class RaidItem(db.Model):
        id = db.Column(db.Integer(), primary_key=True)
        name = db.Column(db.String(length=30), nullable=False, unique=False)

我已经创建了一个用户和几个RaidItems,它们已成功地填充到我的数据库中

在我的一条路线中,我有一个显示“未拥有的项目”和“拥有的项目”的部分

我当前的“无主项”查询如下所示:

items = RaidItem.query.filter(RaidItem.owners == None).all()

“无主项目”显示在屏幕上,但我的逻辑是错误的,我不知道如何解决它。目前,它显示所有“无主项目”,而不考虑用户,但我只想显示单个用户的“无主项目”。要澄清的是,如果user1拥有item1,user2将无法看到item1。这不是我的意图

我的“自有项目”查询如下所示:

owned_items = RaidItem.query.join(association_table, (association_table.c.user_id == current_user.id)).filter(association_table.c.user_id == current_user.id)

如果不执行我的意图,即仅显示当前登录用户当前“拥有”的项目

我的问题有两个方面:

1.) What is the SQLAlchemy query to create an association between the User and a created RaidItem --and--

2.) Once the associations have been created how do I query/filter based off of the "ownership" of the created item?

我已经在下面的一条评论中找到了如何将数据手动插入关联表的方法,但我仍然在努力使这些查询正确无误。 任何帮助或指导将不胜感激,并感谢您的时间


Tags: the项目用户iddbtableitemscolumn
1条回答
网友
1楼 · 发布于 2024-10-01 09:39:46

因此,我通过研究SQL查询以及如何利用db.engine.execute()解决了我的问题。下面的代码是我为解决原始SQL问题而编写的:

owned_items = db.engine.execute(f'SELECT association.raiditem_id 
                                  FROM association 
                                  JOIN user 
                                  ON association.user_id = user.id 
                                  WHERE user.id = {current_user.id}')

唯一的问题是,该方法实际上没有正确引用存储在数据库中的对象。我可以使用下面的SQLAlchemy查询来正确地执行此操作:

owned_items = RaidItem.query.join(association_table).join(User).filter(association_table.c.user_id == current_user.id).all()

我希望这对将来的人有所帮助

相关问题 更多 >