13

私はこのコードを持っています

myquery =   '''SELECT * from users 
               where id = 10 and
               city = 20 and 
               state = 30'''

それらを次のような3つの変数に置き換えたい

var_id = bla
var_city = bla
var_state = bla
4

2 に答える 2

20

params引数をraw()使用して:

var_id = 10
var_city = 20
var_state = 30

mymodel.objects.raw('''SELECT * from users 
                       where id = %s and
                       city = %s and 
                       state = %s ''', [var_id, var_city, var_state])

paramsパラメータのリストです。%s(データベースエンジンに関係なく)クエリ文字列でプレースホルダーを使用します。それらは、パラメータリストのパラメータに置き換えられます。


Djangoドキュメントからの重要な注意:

警告生のクエリでは文字列フォーマットを使用しないでください!

上記のクエリを次のように記述したくなります。

>>> query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname
>>> Person.objects.raw(query)

しないでください。

パラメータリストを使用すると、SQLインジェクション攻撃から完全に保護されます。これは、攻撃者が任意のSQLをデータベースに挿入する一般的なエクスプロイトです。文字列補間を使用すると、遅かれ早かれSQLインジェクションの犠牲になります。常にパラメータリストを使用することを覚えている限り、保護されます。

于 2012-11-02T05:12:58.887 に答える
13

クエリで辞書と変数を次のように使用することもできます。

my_dict = {
   'id': 10,
   'city': 20,
   'state': 30
} 

mymodel.objects.raw('''SELECT * from users 
                       where id = %(id)s and
                       city = %(city)s and 
                       state = %(state)s ''', my_dict)

詳細については、 https: //docs.djangoproject.com/en/1.10/topics/db/sql/#passing-parameters-into-rawをご覧ください。

于 2016-11-07T23:04:39.677 に答える