gpt4 book ai didi

python - SQLAlchemy:如何检测/抑制重复的 JOIN 子句?

转载 作者:行者123 更新时间:2023-12-04 15:08:32 27 4
gpt4 key购买 nike

考虑以下示例代码(使用 SQLAlchemy 1.4):

import os
from sqlalchemy import Column, ForeignKey, Integer, String, select
from sqlalchemy.orm import backref, declarative_base, relationship

Base = declarative_base()

class Parent(Base):
__tablename__ = "parent"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String)
type = Column(String)

class Child(Base):
__tablename__ = "child"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String)
parent_id = Column(Integer, ForeignKey("parent.id"))
parent = relationship("Parent", backref=backref("children"))

def select_parent_name(statement):
return statement.join(Child.parent).add_columns(Parent.name)

def filter_by_parent_name(statement, parent_name):
return statement.join(Child.parent).where(Parent.name == parent_name)

def build_query():
statement = select(Child.id)
if os.getenv("SELECT_PARENT_NAME", True):
statement = select_parent_name(statement)
if os.getenv("FILTER_BY_PARENT", True):
statement = filter_by_parent_name(statement, "foo")
return statement

if __name__ == "__main__":
print(str(build_query()))

这会产生无效的 SQL,相同的 JOIN 子句出现两次:

SELECT child.id, parent.name 
FROM child JOIN parent ON parent.id = child.parent_id JOIN parent ON parent.id = child.parent_id
WHERE parent.name = :name_1

如果执行,它将导致:

(MySQLdb._exceptions.OperationalError) (1066, "Not unique table/alias: 'parent'")

这是一个精简的简单示例,但我要说明的重点是,我正在通过将 SQL 语句传递给不同的函数来构建 SQL 语句,每个函数都有不同的职责,可能需要添加可能已经添加到语句中的 JOIN。

有没有一种简单的方法可以抑制像这样的重复 JOIN?或者检查语句以查看冗余 JOIN 是否已经存在?理想情况下,此信息可以很容易地从语句对象本身确定,而不必单独维护和传递该状态。

最佳答案

SQLAlchemy>=1.4连接表可以在 statement._setup_joins 中找到:

joined_tables = [joins[0].parent.entity for joins in statement._setup_joins]

对于 SQLAlchemy<1.4连接表可以在 statement._join_entities 中找到:

joined_tables = [mapper.class_ for mapper in statement._join_entities]

引用SQLAlchemy<1.4 : Can I inspect a sqlalchemy query object to find the already joined tables?

关于python - SQLAlchemy:如何检测/抑制重复的 JOIN 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65638694/

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