私はこのコードを持っています
myquery = '''SELECT * from users
where id = 10 and
city = 20 and
state = 30'''
それらを次のような3つの変数に置き換えたい
var_id = bla
var_city = bla
var_state = bla
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インジェクションの犠牲になります。常にパラメータリストを使用することを覚えている限り、保護されます。
クエリで辞書と変数を次のように使用することもできます。
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をご覧ください。