8

これはばかげたことかもしれませんが、とにかく尋ねることにしました。

私は次のようなクエリを実行しようとしています:

 cursor.execute("select col1, col2   \
                    from my_tablem \
                    where afield like '%%s%'
                    and secondfield = %s
                    order by 1 desc " % (var1, var2) )

しかし、like 文でエラーが発生します。最初の %s 値を含むすべての結果を取得するために必要な余分な % は好きではありません。

アイデア?

ティア!

4

4 に答える 4

9

まず、なぜ Django ORM を使用しないのですか?

MyClass.objects.filter( aField__contains=var1, secondField__exact=var2 )

次に、期待どおりの SQL を取得していることを確認してください。

stmt= "select... afield like '%%%s%%' and secondfield = '%s'..." % ( var1, var2 )
print stmt
cursor.execute( stmt )

第 3 に、あなたのメソッドには SQL インジェクション攻撃と呼ばれるセキュリティ ホールがあります。このような SQL を行うべきではありません。

Django の ORM の外部で何かを行う必要がある場合は、クエリで文字列置換ではなくバインド変数を使用する必要があります。http://docs.djangoproject.com/en/dev/topics/db/sql/#performing-raw-sql-queriesを参照してください。

于 2009-03-13T18:32:31.443 に答える
8

文字列 '%' を検索文字列にハッキングできますか?

var1 = '%' + var1 + '%'

then query normally:

cursor.execute("select col1, col2 
                    from my_tablem                     where afield like %s
                    and secondfield = %s
                    order by 1 desc " , [var1, var2] )
于 2010-07-03T23:32:09.577 に答える
4

同様の問題がありました。連結された名前フィールドを検索しようとしていました。私のクエリは次のようなものでした:

sql = """SELECT * from auth_user WHERE lower(first_name) || ' ' || lower(last_name) = '%%%s%%'"""

User.objects.raw(sql, [q])

問題は、%% がクエリを壊していたことです。私が巻き上げた解決策は次のとおりです。

q = '%' + q + '%'
sql = """SELECT * from auth_user WHERE lower(first_name) || ' ' || lower(last_name) = %s"""

User.objects.raw(sql, [q])
于 2011-01-03T18:15:59.550 に答える
0
Persona.objects.raw("**SELECT** id,concat_ws(' ',nombre,apellido) **AS** nombre_completo **FROM** persona **GROUP BY** id **HAVING** concat_ws(' ',nombre,apellido) **ILIKE** '%s' " % ('%%' + query + '%%'))

(Postgresql 9.1)

于 2014-03-14T15:42:07.860 に答える