9

次のようにステートメントを作成しようとしています。

SELECT * FROM table WHERE provider IN ('provider1', 'provider2', ...)

ただし、Django API からの文字列の書式設定に問題があります。これが私がこれまでに持っているものです:

profile = request.user.get_profile()
providers = profile.provider.values_list('provider', flat=True) # [u'provider1', u'provider2']
providers = tuple[str(item) for item in providers] # ('provider1', 'provider2')

SQL = "SELECT * FROM table WHERE provider IN %s"
args = (providers,)
cursor.execute(sql,args)

DatabaseError
(1241, 'Operand should contain 1 column(s)')
4

6 に答える 6

6

MySQLdbには、これを支援するメソッドがあります。

Doc

string_literal(...)string_literal(obj)-オブジェクトobjをSQL文字列リテラルに変換します。つまり、特殊なSQL文字はすべてエスケープされ、一重引用符で囲まれます。つまり、次のように実行されます。

"'%s'" % escape_string(str(obj))

Use connection.string_literal(obj), if you use it at all.
_mysql.string_literal(obj) cannot handle character sets.

使用法

# connection:  <_mysql.connection open to 'localhost' at 1008b2420>

str_value = connection.string_literal(tuple(provider))
# '(\'provider1\', \'provider2\')'

SQL = "SELECT * FROM table WHERE provider IN %s"
args = (str_value,)
cursor.execute(sql,args) 
于 2012-06-25T19:46:32.387 に答える
1

私が特に好きではない別の答えですが、明らかなユースケースで機能します:

providers = tuple[str(item) for item in providers] # ('provider1', 'provider2')
# rest of stuff...

SQL = 'SELECT * FROM table WHERE provider IN {}'.format(repr(providers))
cursor.execute(SQL)
于 2012-06-25T20:34:01.067 に答える
0

したがって、必要なIDの文字列入力があります。

some_vals = '1 3 5 76 5 4 2 5 7 8'.split() # convert to suitable type if required
SomeModel.objects.filter(provider__in=some_vals)
于 2012-06-25T19:47:07.253 に答える
0

実行するカーソルオブジェクトに文字列を渡す前に、おそらく文字列の置換を行う必要があります。

sql = "SELECT * FROM table WHERE provider IN (%s)" % \
        (','.join(str(x) for x in providers))
cursor.execute(sql)
于 2012-06-25T19:36:36.880 に答える
-1
"SELECT * FROM table WHERE provider IN ({0},{1},{2})".format(*args) #where args is list or tuple of arguments.
于 2012-06-25T19:30:12.030 に答える
-2

これを試してみてください....うまくいくはずです。

SQL = "SELECT * FROM table WHERE provider IN %s"%(providers)
exec 'cursor.execute("%s")'%(SQL)
于 2012-06-25T20:23:01.890 に答える