【问题标题】:SqlAlchemy Core and bare exists querySqlAlchemy Core 和裸存在查询
【发布时间】:2013-03-01 04:03:08
【问题描述】:

我遇到了一个问题,我必须使用 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 一样高效?

【问题讨论】:

    标签: python sqlalchemy exists


    【解决方案1】:

    根据the documentationexists适用于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?坦率地说,我不知道,我什至不确定答案是否取决于您的数据库引擎...

    【讨论】:

    • 谢谢!我尝试了这个并引发了以下错误:ArgumentError: columns argument to select() must be a Python list or other iterable
    • 对不起,我忘了括号!编辑我的答案。
    • 谢谢!它适用于方括号。奇怪的是,文档中没有提到exists 的这种用法。我认为这是确定数据库中是否存在某些内容的常见操作。
    猜你喜欢
    • 2013-02-20
    • 2017-11-05
    • 2011-11-30
    • 1970-01-01
    • 2020-06-08
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多