我知道
WHERE column ~ 'regexp'
这是 sqlalchemy:
where(column.op('~')('regexp'))
但我怎么能创造这个?
WHERE 'string' ~ column
(正则表达式存储在数据库中)
我知道
WHERE column ~ 'regexp'
这是 sqlalchemy:
where(column.op('~')('regexp'))
但我怎么能创造这个?
WHERE 'string' ~ column
(正则表达式存储在数据库中)
您需要创建 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 ...)`
一个非 Sqlalchemy 特定的解决方案是在 PostgreSQL 后端创建您自己的操作数反转操作数。这也可以让你做类似的事情
string ### ANY(ARRAY[regexp1, regexp2, ...])
###
你的接线员在哪里。(找到一个好名字可能是一个挑战。)