Python SQLAlchemy:在子查询中使用外部查询中的列 我的问题

Python SQLAlchemy:在子查询中使用外部查询中的列 我的问题,python,sql,sql-server,sqlalchemy,Python,Sql,Sql Server,Sqlalchemy,我有一个MSSQL查询,我想将其转换为SQLAlchemy: 从Artikel中选择*作为根,其中从Artikel中选择COUNT*,其中Artikel.MM\u ParentID=root.ROW\u ID=0,MM\u ParentID=0; 这就是我所尝试的: root=sqlalchemy.orm.aliasedgsdarticel,name='root' parent\u count\u query=gsd\u session.querysqla.func.count.select\u

我有一个MSSQL查询,我想将其转换为SQLAlchemy:

从Artikel中选择*作为根,其中从Artikel中选择COUNT*,其中Artikel.MM\u ParentID=root.ROW\u ID=0,MM\u ParentID=0; 这就是我所尝试的:

root=sqlalchemy.orm.aliasedgsdarticel,name='root' parent\u count\u query=gsd\u session.querysqla.func.count.select\u from gsdartikel.filterGSDArtikel.MM\u ParentID==root.row\u id results=gsd\u session.queryroot.filterparent\u count\u query==0&root.MM\u ParentID==0 但是,parent\u count\u query==0会生成一个bool,这会导致此操作失败:

TypeError: unsupported operand type(s) for &: 'bool' and 'BinaryExpression'
父查询的类型为sqlalchemy.orm.query.query

我还尝试添加.subquery,它将类型更改为sqlalchemy.sql.selectable.Alias,但在比较时仍然给出False

当我打印生成的内部查询时,它看起来不像我期望的那样:

选择count*作为count_1 来自[Artikel],[Artikel]作为根 其中[Artikel].[MM\u ParentID]=根.row\u id 我还尝试使用sqla.and\u parent\u count\u query==0,root.MM\u ParentID==0代替&-然后我没有得到TypeError,而是得到以下SQL结果:

选择 从[Artikel]作为根 其中0=1 我做错了什么

大局 我有一个包含根行和子行的表,基本上如下所示:

| row_id | MM_ParentID |
------------------------
| 1      | 0           |
| 2      | 0           |
| 3      | 0           |
| 4      | 1           |
| 5      | 1           |
| 6      | 3           |

我试图找到的是父项为MM_ParentID==0且没有子项的所有行。子查询获取MM_ParentID等于当前项的行id的所有子项,返回0行。因此,在本例中,将返回第2行的项。

您的问题是无法在sqlalchemy中构建子查询,然后像在纯SQL中那样比较结果

无论如何,如果我正确理解了你的问题,我会用另一种方式解决它;首先获取具有父对象的项目

In [39]:
from sqlalchemy.orm import aliased
root = aliased(Article, name='root')
subq = session.query(Article.id).select_from(Article).filter(Article.parent_id == root.id)
print(subq)

SELECT article.id AS article_id 
FROM article, article AS root 
WHERE article.parent_id = root.id
然后查找如下根文章:

In [40]:
from sqlalchemy import tuple_
results = session.query(Article).filter(~Article.id.in_(subq))
print(results)

SELECT article.id AS article_id, article.parent_id AS article_parent_id 
FROM article 
WHERE article.id NOT IN (SELECT article.id AS article_id 
FROM article AS root 
WHERE article.parent_id = root.id)
当然还有其他方法;这是我发现的最简单的方法,如果你的桌子很大,可能不是最佳的。很抱歉,我对您的表名和列名使用了不同的拼写


希望能有所帮助。

您的问题是无法在sqlalchemy中构建子查询,然后像在纯SQL中那样比较结果

无论如何,如果我正确理解了你的问题,我会用另一种方式解决它;首先获取具有父对象的项目

In [39]:
from sqlalchemy.orm import aliased
root = aliased(Article, name='root')
subq = session.query(Article.id).select_from(Article).filter(Article.parent_id == root.id)
print(subq)

SELECT article.id AS article_id 
FROM article, article AS root 
WHERE article.parent_id = root.id
然后查找如下根文章:

In [40]:
from sqlalchemy import tuple_
results = session.query(Article).filter(~Article.id.in_(subq))
print(results)

SELECT article.id AS article_id, article.parent_id AS article_parent_id 
FROM article 
WHERE article.id NOT IN (SELECT article.id AS article_id 
FROM article AS root 
WHERE article.parent_id = root.id)
当然还有其他方法;这是我发现的最简单的方法,如果你的桌子很大,可能不是最佳的。很抱歉,我对您的表名和列名使用了不同的拼写


希望能有所帮助。

我最终简化了查询,使其将子项连接到父项,然后获取子项为空的子项:

流浪父母=gsd\U session.queryitem .outerjoinchild,item.row\u id==child.MM\u ParentID .filteritem.MM_ParentID==0,child.row_id==None
我最终简化了查询,使其将子项连接到父项,然后获取子项为空的查询:

流浪父母=gsd\U session.queryitem .outerjoinchild,item.row\u id==child.MM\u ParentID .filteritem.MM_ParentID==0,child.row_id==None