2017-03-03 54 views
0

IN(未重複私は作品これを行う方法があることを知っている:。。Parameter substitution for a SQLite "IN" clause)はなぜこれは機能しませんか? WHERE

私はにこのコードを欠けているものを知っているように思います。私は簡単なテーブルを作成します。次に、レコードの一部を新しいテーブルにコピーします。このテーブルでは、2つのリストを含むWHERE句によってレコードが修飾されます。私は同じレコードをコピーしようとしましたが、今回はSQL文に挿入する変数にリストを入れました。今回は、レコードはコピーされません。

どうしてですか?

import sqlite3 

conn = sqlite3.connect(':memory:') 
curs = conn.cursor() 

oldTableRecords = [ [ 15, 3 ], [ 2, 1], [ 44, 2], [ 6, 9 ] ] 

curs.execute('create table oldTable (ColA integer, ColB integer)') 
curs.executemany('insert into oldTable (ColA, ColB) values (?,?)', oldTableRecords) 

print ('This goes ...') 
curs.execute('''create table newTable as 
    select * from oldTable 
    where ColA in (15,3,44,9) or ColB in (15,3,44,9)''') 

for row in curs.execute('select * from newTable'): 
    print (row) 

curs.execute('''drop table newTable''') 

print ('This does not ...') 
TextTemp = ','.join("15 3 44 9".split()) 
print (TextTemp) 
curs.execute('''create table newTable as 
    select * from oldTable 
    where ColA in (?) or ColB in (?)''', (TextTemp,TextTemp)) 

for row in curs.execute('select * from newTable'): 
    print (row) 

出力:

This goes ... 
(15, 3) 
(44, 2) 
(6, 9) 
This does not ... 
15,3,44,9 

TIA!

+0

なぜ 'TextTempは= ''()(.splitを "15 3 44 9")に参加'代わりに:あなたは別のプレースホルダあなたのパラメータの値のそれぞれについて、を使用する必要が

ちょうど ''15,3,44,9''の? –

+0

私は不在だったので。 –

+0

それはかなり良い理由です:-) –

答えて

3

SQLパラメータ全体のポイントは、です。値のSQL構文が実行されないようにします。。これには値の間のコンマが含まれます。これが当てはまらない場合は、クエリーパラメータにカンマを使用して値を使用することはできず、おそらく起動時のセキュリティ上の問題です。

?を使用して複数の値をクエリに挿入することはできません。全体TextTemp値は、以下の同等の製造値として見られる:

create table newTable as 
select * from oldTable 
where ColA in ('15,3,44,9') or ColB in ('15,3,44,9') 

ColA又はColBの値はいずれも文字列値15,3,44,9と単一の行を持っていません。

col_values = [int(v) for v in "15 3 44 9".split()] 

placeholders = ', '.join(['?'] * len(col_values)) 
sql = '''create table newTable as 
    select * from oldTable 
    where ColA in ({0}) or ColB in ({0})'''.format(placeholders) 

curs.execute(sql, col_values * 2) 
+0

私はちょうどあなたがそれをフォーマットするとどうなるかをOPに尋ねようとしていました:) –

+0

これは痛いかもしれません。 –

関連する問題