簡體   English   中英

SQLAlchemy不區分大小寫的基於搜索的查詢?

[英]SQLAlchemy case insensitive IN based search query?

如何以安全的方式在SQLAclhemy ORM中進行不區分大小寫的搜索?

我自己和我項目中的其他人都在尋找這個,但我們似乎無法找到任何符合我們需求的東西。

在原始SQL中,我可以這樣做:

 SELECT * FROM TABLENAME WHERE UPPER(FIELDNAME) IN (UPPER('foo'), UPPER('bar'));

..如果FOO和BAR在未知情況下不是用戶輸入。 事實上,我擔心以下情況:

  1. 安全性:我不希望以SQL注入攻擊的形式訪問Bobby Tables( http://xkcd.com/327/ )。我無法找到告訴我如何在SQLAlchemy或I中轉義字符串的文檔會覺得加入琴弦更安全(但仍然覺得這樣做很臟)。
  2. 速度主要通過索引處理,但很明顯,在發出查詢之前在RAM中進行大小寫修正比告訴DB更快,所以我不會在查詢中執行UPPER,除非我真的不得不這樣做。 然而,上面是展示我想做的最佳方式。 但是,它不應該做任何瘋狂的事情。
  3. 平台不可知代碼。 我將在多種數據庫類型上運行它 - 它將進行全面測試,我對此事有任何發言權 - 我不希望將查詢綁定到SQL的特定對話框。 畢竟,為什么我使用SQLAlchemy。 :)

如果它有幫助我們目前綁定到8.4版本的SQLAlchemy由於我們使用其他庫。

這應該完全編譯...

query( models.Object )\
.filter( 
     sqlalchemy.func.upper( models.Object.fieldname )\
     .in_( (sqlalchemy.func.upper(foo) , sqlalchemy.func.upper(bar), ) )
)\
.all()

  1. 你也可以傳入大寫文字。 個人而言,我會做in_( foo.uppercase() , bar.uppercase() )

  2. SqlAlchemy與DBAPI一起將綁定參數傳遞到后端數據存儲區。 翻譯 - 值會自動轉義。


如果你想做一個字符串列表,這樣的東西應該工作

.in_( [ i.upper() for i in inputs ] )
.in_( [ sqlalchemy.func.upper(i) for i in inputs ] )

只想添加一下,如果你想優化這些選擇速度,並且在Postgres或Oracle上,你可以創建一個'功能索引'

CREATE INDEX table_fieldname_lower_idx ON table(lower(fieldname))

查詢計划程序(在數據庫中)將知道在搜索lower(fieldname)查詢時使用該lower(fieldname)索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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