[英]String literal as the left hand side argument of 'like' operator using SQLAlchemy
[英]Sqlalchemy: use PSQL's `~` operator when string is on left and column on right
我知道
WHERE column ~ 'regexp'
這是 sqlalchemy:
where(column.op('~')('regexp'))
但我怎么能創造這個?
WHERE 'string' ~ column
(正則表達式存儲在數據庫中)
您需要創建一個literal()
或一個bindparam()
:
from sqlalchemy.sql import expression
expression.literal('string').op('~')(column)
# or
expression.bindparam('text', 'string').op('~')(column)
一個literal()
基本上是一個帶有隱式名字的bindparam()
; 在上面的示例中, 'text'
是 SQL 語句中使用的參數的名稱(鍵), 'string'
是您希望出現在運算符左側的文本。
bindparam()
給你更多的控制,包括傳遞可調用而不是具體值的能力:
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, ...])
其中###
是您的運營商。 (找到一個好名字可能是一個挑戰。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.