簡體   English   中英

Sqlalchemy:當字符串在左邊而列在右邊時使用 PSQL 的`~` 運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM