首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlAlchemy核心和bare存在查询

SqlAlchemy核心和bare存在查询
EN

Stack Overflow用户
提问于 2013-03-13 09:39:42
回答 1查看 5.1K关注 0票数 10

我遇到了一个问题,必须使用SqlAlchemy Core在表中查找数据是否存在。

我认为执行此查询的最佳方法是使用exists方法,该方法在找到第一项后立即停止搜索。因此,我构建了这个版本的查询:

代码语言:javascript
复制
conn = self.db.connect()
query = exists().where(cookie_table.c.cookie_id == cookie_id)
result = conn.execute(query)

但是它会产生这样的错误:

代码语言:javascript
复制
StatementError: Not an executable clause (original cause: ArgumentError: Not an
executable clause) 'EXISTS (SELECT * \nFROM cookie \nWHERE cookie.cookie_id = ?)' []

我尝试修改它一点(结合select),但没有效果。

因此,我最终想出了另一个解决方案,使用limit(1),这是可行的。

代码语言:javascript
复制
conn = self.db.connect()
query = select([1], cookie_table.c.cookie_id == cookie_id).limit(1)
result = conn.execute(query).fetchone()
return True if result is not None else False

我有两个问题:

如何用exists方法完成任务?

使用limit的查询效率与exists一样高吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-13 10:53:15

根据文献资料exists适用于Select对象,并提供了以下示例:

代码语言:javascript
复制
# use on an existing select()
s = select([table.c.col1]).where(table.c.col2==5)
s = exists(s)

# construct a select() at once
exists(['*'], **select_arguments).where(criterion)

# columns argument is optional, generates "EXISTS (SELECT *)"
# by default.
exists().where(table.c.col2==5)

,那么你的代码出了什么问题?

根据我的理解,EXISTS本身并不是一个指令,因此尝试执行exists()将失败,因为它不是可执行子句。

为了举例说明,您可以尝试使用一个简单的sqlite控制台:

  • EXISTS(SELECT * from t);是一个错误
  • SELECT EXISTS(SELECT * FROM t);如预期的那样产生0或1。

如何解决你的问题?

exists()包装在select()可执行语句中:

代码语言:javascript
复制
result = conn.execute(select([exists().where(cookie_table.c.cookie_id == cookie_id)]))

它应如预期那样发挥作用:

代码语言:javascript
复制
>>> print select([exists().where(users.c.name=='test')])
SELECT EXISTS (SELECT *
FROM users
WHERE users.name = :name_1)

现在,您应该使用exists还是limit?坦白说,我不知道,我甚至不确定答案不取决于你的数据库引擎.

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15381604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档