sqlalchemy在过滤器中使用自定义方法

时间:2015-07-24 07:41:18

标签: python sql sqlalchemy

我对此sqlalchemy查询有问题:

def bvalue(value):
    if isinstance(value, unicode):
        value = re.sub('[^\w]', "", value).lower()
    return value

basicValue = bvalue(someVariable)

q = self.session.query(sheet.id).\
    filter(bvalue(sheet.column) == basicValue)

bvalue功能有效。我试图在将它们从任何特殊字符和大小写中剥离后匹配值。剥离的变量与剥离的db值匹配,但查询仍未检索到任何结果。

我做错了什么?你不能在过滤器中使用自定义方法吗?

1 个答案:

答案 0 :(得分:0)

您是否知道SQLAlchemy会将您的查询转换为纯SQL语句,然后将其发送到您配置的数据库?

很自然地,你不能简单地添加任意python函数,因为它们必须被翻译成SQL,而这些SQL不能以通用的方式完成。

除了这个一般性问题,bvalue(sheet.column)将只返回sheet.column(因为它不是unicode实例),并在创建查询之前对其进行评估。所以你的查询实际上相当于:

q = self.session.query(sheet.id).\
    filter(sheet.column == basicValue)

如何将正则表达式转换为SQL取决于您正在使用的数据库。检查例如 REGEXP_LIKE in SQLAlchemy 提出一些建议。