2

我知道

WHERE column ~ 'regexp'

这是 sqlalchemy:

where(column.op('~')('regexp'))

但我怎么能创造这个?

WHERE 'string' ~ column

(正则表达式存储在数据库中)

4

2 回答 2

3

您需要创建 aliteral()或 a bindparam()

from sqlalchemy.sql import expression

expression.literal('string').op('~')(column)
# or
expression.bindparam('text', 'string').op('~')(column)

Aliteral()基本上是bindparam()带有隐式名称的 a;在上面的示例'text'中是 SQL 语句中使用的参数的名称(键),以及'string'您希望出现在运算符左侧的文本。

Abindparam()为您提供了更多控制权,包括传入calleble而不是具体值的能力:

def value_function():
    return some_calculation_result()

expression.bindparam('calculated_value', callable_=value_function).op('~')(column)

并且 SQLAlchemy 将value_function()在将语句发送到数据库服务器时调用。bindparam()如果您有一系列值,您也可以使用,SQLAlchemy 将负责调整表达式以应用于序列中的每个值:

strings = ['string1', 'string2', ...]
expression.bindparam('one_or_more', strings).op('~')(column)
# executes `('string1' ~ column OR 'string2' ~ column OR ...)`
于 2013-03-01T19:36:01.727 回答
0

一个非 Sqlalchemy 特定的解决方案是在 PostgreSQL 后端创建您自己的操作数反转操作数。这也可以让你做类似的事情

string ### ANY(ARRAY[regexp1, regexp2, ...])

###你的接线员在哪里。(找到一个好名字可能是一个挑战。)

于 2013-05-15T13:10:41.753 回答