【问题标题】:Partial UUID match in Python/SQLAlchemyPython/SQLAlchemy 中的部分 UUID 匹配
【发布时间】: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


【解决方案1】:

什么对我有用:

安装:- sqlalchemy_utils

from sqlalchemy_utils.functions import cast_if

# Get the keys. kwargs is the dict that I receive as a parameter.
kwarg_keys = kwargs.keys()

# Check if the key 'org_uuid' exists
org_uuid = kwargs['org_uuid'] if 'org_uuid' in kwarg_keys else ''

rows = my_model.query.filter(cast_if(my_model.org_uuid, sa.String).like(f'%{org_uuid}%'))

上面,my_model 有一个 uuid 列 org_uuid,我想查询和过滤它。不保证函数会收到带有org_uuid 的字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2013-09-24
    • 2017-07-15
    • 2019-06-10
    • 1970-01-01
    • 2014-08-12
    • 2012-08-15
    相关资源
    最近更新 更多