【发布时间】:2020-10-24 16:47:16
【问题描述】:
尝试在 Python/SQLAlchemy 中开发一个脚本,该脚本可以采用子字符串并将其与 UUID 部分匹配。例如:字符串“d78d”将匹配 UUID('3f522efe-d78d-4081-99a5-9aad6b5332be')。显然,您无法通过将 UUID 对象与字符串进行比较来过滤查询,因此我尝试了以下脚本:
import sqlalchemy
from sqlalchemy.sql.expression import cast
my_search_value = "d78d"
my_query = db.session.query(People.id).filter(
cast(People.id, sqlalchemy.String).ilike(f"%{my_search_value}%")
不幸的是,即使我确定我的数据库中有一条包含该搜索值的记录,这也没有返回任何结果。但是,当我调试脚本时,我可以看到 SQLAlchemy 如何将此查询转换为 Postgresql 的结果:
Select people.id
From people
Where lower(CAST(people.id as VARCHAR)) LIKE lower(:param_1)
当我将其复制并粘贴到我的数据库客户端(将 lower(:param_1) 替换为 '%d78d%')时,它会按预期执行。因此,我认为尝试将子字符串与 UUID 部分匹配并没有任何内在的错误,但是我在 Python/SQLAlchemy 中遗漏了一些阻止我的脚本工作的东西。 p>
对于它的价值,我尝试使用以下运算符:LIKE、ILIKE、MATCH....所有结果都相同。
【问题讨论】:
-
尝试使用绑定参数打印 SQL,就像这个答案一样。 link。您可以看到 sqlahcmemy SQL 和您预期的 SQL 的区别。
标签: python sql postgresql sqlalchemy