[英]sqlalchemy join on subquery with new API
我無法將 SQL 語句轉換為 sqlalchemy orm。 問題是我無法將生成的x
子查詢與FileTag
表連接起來
我想使用新的 API,即不使用query
SQL 語句
statement = f"""
SELECT file_tags.id,file_tags.file_id,file_tags.tag,file_tags.category from
(SELECT id,file_id, count(DISTINCT tag)
FROM file_tags
WHERE {string_condition}
GROUP BY file_id
HAVING COUNT(DISTINCT tag) = {num_conditions}) as x
JOIN file_tags on file_tags.file_id = x.file_id
"""
sqlalchemy ORM(僅最后一部分,加入 x/file_tag 不起作用)
from sqlalchemy import func, subquery, join, alias
# x is correct and working
x = (
select(FileTag)
.where((FileTag.tag == "eso") & (FileTag.category == "top_category"))
.group_by(FileTag.file_id)
.having(func.count(FileTag.tag) == num_conditions)
.subquery()
)
# I am not able to join x subquery. Throws several different errors
# Here I tried a lot of different variations.
query = join(x,FileTag.file_id==x.c.file_id)
session.execute(query)
我認為主要問題是我不知道如何使用 sqlalchemy,但我嘗試了所有可能的方法並且總是得到不同的錯誤。 有任何想法嗎?
將x
聲明為.subquery()
,然后為您的join
提供一些連接:
from sqlalchemy import Column, func, Integer, select, String
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class FileTag(Base):
__tablename__ = "file_tags"
id = Column(Integer, primary_key=True)
tag = Column(String)
category = Column(String)
file_id = Column(String)
num_conditions = 3
x = (
select(FileTag)
.where((FileTag.tag == "something") & (FileTag.category == "top_category"))
.group_by(FileTag.file_id)
.having(func.count(FileTag.tag) == num_conditions)
.subquery()
)
query = select(FileTag).join(x, x.c.file_id == FileTag.file_id)
print(query)
"""
SELECT file_tags.id,
file_tags.tag,
file_tags.category,
file_tags.file_id
FROM file_tags
JOIN (
SELECT file_tags.id AS id,
file_tags.tag AS tag,
file_tags.category AS category,
file_tags.file_id AS file_id
FROM file_tags
WHERE file_tags.tag = :tag_1
AND file_tags.category = :category_1
GROUP BY file_tags.file_id
HAVING count(file_tags.tag) = :count_1
) AS anon_1
ON anon_1.file_id = file_tags.file_id
"""
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.