2017-03-07 59 views
1

我正在使用Django + PostgreSQL應用程序中的原始SQL查詢,並且遇到了必須作爲參數傳遞PostgreSQL數組值(類型爲tags = ArrayField(m.CharField(max_length=80),數據庫爲應用程序/ tags character varying(80)[])的問題。Django原始查詢 - 如何傳遞postgres數組值作爲參數?

我用這樣的代碼:

​​

......在得到這樣的SQL的希望產生:

SELECT * FROM myapp_code_products WHERE (tags @> '{"red"}') 

但我要麼得到根本算不了什麼取代像(tags @>)或列表或元組替換,如(tags @> ['red'])(tags @> ('red')),並且顯然這些結果都不包含有效的包含查詢。

而且,如果有人想知道,替換的參數是用戶提供的,所以只是完全繞過參數替換在這裏不是安全明智的選項。

注:還,使用原始查詢要使用的查詢集和模型的查詢這裏考慮的要求,是不是一個不錯的選擇。

(詳細信息:我在Windows 10 64位使用Django 1.10.5使用Python 3.6.0和PostgreSQL 9.3)

+0

所以,你不想使用'ArrayField '[s] [包含](https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#contains)查找爲你建立'@>'查詢,對不對? – Udi

回答

1

這裏是爲我的作品在Postgres的一個例子9.6

>>> from django.db import connection 
>>> a = ["a","b","c"] 
>>> b = ["b"] 
>>> c = connection.cursor() 
>>> c.execute("""SELECT %s::VARCHAR[] @> %s::VARCHAR[];""", (a,b)) 
>>> c.fetchall() 
[(True,)] 

請記住,如果tagsArrayField,這應該工作以及:

Product.objects.filter(tags__contains=['red']) 
+0

謝謝!這工作。我之前嘗試過的是'array%s :: varchar []',但沒有意識到'當將列表替換爲參數值時會自動添加'數組',因此最終會生成'arrayARRAY [var] []'' 。我只是沒有注意 – NeuronQ

+0

,如果你可以請編輯你的答案還包括一個'>>> c = connection.cursor()'行是100%可執行代碼:) – NeuronQ