Python SqlAlchemy核心和裸查询

Python SqlAlchemy核心和裸查询,python,sqlalchemy,exists,Python,Sqlalchemy,Exists,我遇到了一个问题,我必须使用SqlAlchemy Core查找表中是否存在数据 我认为执行此查询的最佳方法是使用exists方法,该方法在找到第一项后立即停止搜索。因此,我制作了这个版本的查询: conn = self.db.connect() query = exists().where(cookie_table.c.cookie_id == cookie_id) result = conn.execute(query) 但它会产生这样的错误: StatementError: Not an

我遇到了一个问题,我必须使用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对其进行一些修改,但没有效果

所以,最终我想出了另一个解决方案,使用limit1,它是有效的

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查询一样有效?

根据,exists应用于选定对象,并提供以下示例:

# 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控制台:

退出从t中选择*;这是一个错误 选择exists从t中选择*;按预期生成0或1。 如何解决您的问题

在select executable语句中包装您的exists:

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?坦白地说,我不知道,我甚至不确定答案是否取决于您的数据库引擎…

谢谢!我尝试了这个,但出现了以下错误:ArgumentError:columns要选择的参数必须是Python列表或其他iterableSorry,我忘记了括号!编辑我的答案。谢谢!它使用方括号。奇怪的是,文档中没有提到exists的这种用法。我认为,确定数据库中是否存在某些内容的操作并不少见。