我遇到了一个问题,我必须使用 SqlAlchemy Core 查找表中是否存在数据。
我认为执行此查询的最佳方法是使用exists
方法,该方法会在找到第一个项目后立即停止搜索。所以,我精心设计了这个版本的查询:
conn = self.db.connect()
query = exists().where(cookie_table.c.cookie_id == cookie_id)
result = conn.execute(query)
但它产生了这个错误:
StatementError: Not an executable clause (original cause: ArgumentError: Not an
executable clause) 'EXISTS (SELECT * \nFROM cookie \nWHERE cookie.cookie_id = ?)' []
我尝试了一点修改(与select结合使用),但无济于事。
所以,最终我想出了另一种解决方案,使用limit(1)
,这有效。
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
一样有效吗?
答案 0 :(得分:7)
根据the documentation,exists
适用于Select
对象,并提供以下示例:
# 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()
可执行声明:
result = conn.execute(select([exists().where(cookie_table.c.cookie_id == cookie_id)]))
它应该按预期工作:
>>> print select([exists().where(users.c.name=='test')])
SELECT EXISTS (SELECT *
FROM users
WHERE users.name = :name_1)
现在,您应该使用exists
还是limit
?坦率地说,我不知道,我甚至不确定答案是否依赖于您的数据库引擎......