SQLAlchemy 选择与存在限制

2 投票
2 回答
3953 浏览
提问于 2025-04-17 14:13

我有一个包含4列(其中1列是主键)的表格,我需要从中选择30行数据。

在这些行中,有两列(A列和B列)必须在另一个表格中存在(这个表格有8列,其中1列是主键,另外2列是A和B)。

第二个表格很大,里面有几百万条记录,对我来说,只要知道第一张表的A列和B列中是否有至少一条记录在第二张表中存在就可以了。

我正在使用下面的代码:

query = db.Session.query(db.Table_1).\
        filter(
            exists().where(db.Table_2.col_a == db.Table_1.col_a).\
                     where(db.Table_2.col_b == db.Table_2.col_b)
        ).limit(30).all()

这个查询能得到我想要的结果,但我有点担心它可能会比较慢,因为它没有给exists()函数加上limit条件,也没有用select 1,而是用了select *

exists() does not accept a .limit(1)

我该如何给exists加个限制,这样就不需要查整个表,从而让这个查询运行得更快呢?

  • 我需要从Table_1中获取n行数据,这2列在Table_2中的某条记录中存在

谢谢

2 个回答

-1
query=select([db.Table_1])
query=query.where(
     and_(
           db.Table_2.col_a == db.Table_1.col_a,
           db.Table_2.col_b == db.Table_2.col_b
          )
     ).limit(30)

result=session.execute(query)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

8

你可以用一种更明确的方式来做“select 1”的操作,具体可以参考这里的说明,也就是:

exists([1]).where(...)

不过,虽然我一直以来都是“select 1”的忠实粉丝,但我后来发现,使用“1”和“*”在性能上的差别现在已经被认为是一种误解更多信息 / 更多信息)。

exists()其实是select()的一个封装,所以你可以先构建select(),然后再使用limit():

s = select([1]).where(
         table1.c.col_a == table2.c.colb
       ).where(
         table1.c.colb == table2.c.colb
       ).limit(30)
s = exists(s)

撰写回答