加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – SqlAlchemy Core和裸存在的查询

发布时间:2020-12-20 11:26:00 所属栏目:Python 来源:网络整理
导读:我遇到了一个问题,我必须使用SqlAlchemy Core查找表中是否存在数据. 我认为执行此查询的最佳方法是使用exists方法,该方法会在找到第一个项目后立即停止搜索.所以,我精心设计了这个版本的查询: conn = self.db.connect()query = exists().where(cookie_table
我遇到了一个问题,我必须使用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方法实现任务?

具有限制的查询是否与存在一样有效?

解决方法

根据 the documentation,存在适用于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)

现在,你应该使用存在还是限制?坦率地说,我不知道,我甚至不确定答案是否依赖于您的数据库引擎……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读