Django原始查询 - 如何将postgres数组值作为参数传递?

时间:2017-03-07 15:14:50

标签: python django postgresql django-models

我在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)

1 个答案:

答案 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