我在Django + PostgreSQL应用程序中处理原始SQL查询,并且我遇到了必须在应用程序中传递PostgreSQL数组值(类型为tags = ArrayField(m.CharField(max_length=80)
)的问题db中的/ tags character varying(80)[]
。
我使用的代码如下:
Product.objects.raw('SELECT * FROM myapp_code_products WHERE tags @> %s', [
['red'] # also tried with simply string '{"red"}' but that didn't work either, also tried with tuple
])
...希望能够像这样生成SQL:
SELECT * FROM myapp_code_products WHERE (tags @> '{"red"}')
但我要么只是取代(tags @>)
或者像(tags @> ['red'])
或(tags @> ('red'))
这样的列表或元组替换,显然这些都不会产生有效的包含查询。
并且,如果有人想知道,替换参数是用户提供的,那么完全绕过参数替换不是安全方面的选项。
注意:此外,在此处使用原始查询是一项要求,此处不能使用查询集和模型查询。
(详情:我在Windows 10 64bit上使用Django 1.10.5和Python 3.6.0以及PostgreSQL 9.3)
答案 0 :(得分:1)
以下示例适用于postgres 9.6 :
C:\Projekte\railstest3>ruby bin/rails generate controller Welcome index
create app/controllers/welcome_controller.rb
route get 'welcome/index'
invoke erb
create app/views/welcome
create app/views/welcome/index.html.erb
invoke test_unit
create test/controllers/welcome_controller_test.rb
invoke helper
create app/helpers/welcome_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/welcome.coffee
invoke scss
create app/assets/stylesheets/welcome.scss
C:\Projekte\railstest3>cd..
C:\Projekte>cd railstest
C:\Projekte\railstest>ruby bin/rails generate controller Welcome4 index
create app/controllers/welcome4_controller.rb
route get 'welcome4/index'
invoke test_unit
create test/controllers/welcome4_controller_test.rb
C:\Projekte\railstest>rails -v
Rails 5.0.2
请注意,如果>>> 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,)]
是tags
,这也应该有效:
ArrayField