相关列不存在时SQLAlchemy忽略筛选器

2024-09-28 15:23:24 发布

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

我在使用SQLalchemy构造查询时遇到问题。以下是我定义的模型的简化表示:

模型

项目

class Project(Base):

    __tablename__ = 'project'

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

    # User associations
    users = relationship(
        'User',
        secondary='user_project_association'
    )

用户

^{pr2}$

用户<;->;项目(关联)

class UserProjectAssociation(Base):

    __tablename__ = 'user_project_association'

    # User association.
    user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
    user = relationship('User', backref='project_associations')

    # Project association.
    project_id = Column(Integer, ForeignKey('project.id'), primary_key=True)
    project = relationship('Project', backref='user_associations')

查询

我想对projects表执行一个查询,以便结果包含有关项目的信息以及有关关联用户的信息(如果有的话)。我包括一个基于用户名的过滤器。我最终将通过一个restapi以JSON的形式发送结果,因此我更希望结果是python{dict}对象,而不是SQLAlchemy对象。我正在执行的查询如下所示:

# Add return fields
query = session.query(
    Project.id,
    Project.name,
    User.id.label('users.id'),
    User.name.label('users.name')
)

# Add join statements
query = query.outerjoin(User, Project.users)

# Add filters
query = query.filter(
    Project.name == 'proj1', 
    User.name != 'jane.doe'  # <--- I think this is causing the issue.
)

# Execute
results = query.all()
data = [result._asdict() for result in results]
print(data)      

结果

数据库包含一个名为proj1的项目,它没有任何关联的用户。在这个特定的场景中,我正在筛选用户列,而用户关联不存在。但是,我仍然希望在结果中获得项目的行,但是查询返回一个空列表。我期待的结果是这样的:

[{'id': 1, 'name': 'proj1', 'users.id': None, 'users.name': None}]

有人能解释一下我哪里出错了吗?在


Tags: 项目用户nameprojectidtruecolumninteger
1条回答
网友
1楼 · 发布于 2024-09-28 15:23:24

您必须考虑左联接since ^{} compares values and NULL is the absence of value产生的空值,因此NULL != 'jane.doe'的结果是NULL,而不是true

query = query.filter(
    Project.name == 'proj1',
    or_(User.name == None, User.name != 'jane.doe')
)

注意,SQLAlchemy以一种特殊的方式处理与None的相等,并生成IS NULL。如果你想不那么模棱两可,你也可以使用User.name.is_(None)。在

相关问题 更多 >