2017-03-09 11 views
0

文字列の配列から文字列の書式設定を使用して文字列を挿入しようとしています。Python文字列書式設定:単一引用符での問題

しかし何らかの理由で、Pythonは最初の%sを目的の文字列で埋めていますが、一重引用符で囲んでいます。

この動作を防止する明確な方法はありますか?私は次のことを実行すると

myString = [['000b', 
    '1', 
    'Text1', 
    '1.74', 
    'Text2', 
    'None'], 
['000b', 
    '1', 
    'TextA', 
    '12.92', 
    'TextB', 
    'None']] 

cursor.executemany("INSERT INTO schema.myTable_%s_name (col1, col2, col3, col4, col5) VALUES (%s, NULLIF(%s,'None')::decimal, NULLIF(%s,'None')::decimal, %s, NULLIF(%s,'None')::int)", myString[0:len(myString)]) 

期待される動作は、テーブル名がschema.myTable_000b_nameになっていることですが、Pythonは自然に実行されているからSQLを防止schema.myTable_'000b'_nameを書き込みます。一重引用符を挿入しないように指定するにはどうすればよいですか?

答えて

1

これは、あなたが思うように動作しません。

executemanyプロシージャは、SQL文を作成し、同じ文を実行して別のパラメータにバインドします。このようにすることができます。すばやく多くの行を表に挿入します。

これは、それぞれ独自のパラメータを持つ複数の異なる SQL文を実行することを許可していません。パラメータからテーブル名を補間することはサポートされていません。それが働くように試みられたという事実は、特徴ではなく好奇心です。

多くのテーブルに挿入する必要がある場合は、多くのinsert文を発行します。通常のPython補間を使用してテーブル名を計算します。 DBドライバは、テーブル名の真ん中にあるパラメータをvarchar定数として解釈し、正しく引用します。

0

PythonでSQL文字列を生成するときは、実際にはPythonの.format(key=value)の構文を調べることをお勧めします。 https://pyformat.infoを参照してください。これは、クエリ

my_array = [{table: 'something',value: 'something_else'}] 

for opts in my_array: 
    query = 'select * into {table} from some_table where x = {value}'.format(**opts) 
+0

の偉大な、非常に直感的に作成することができますねえ、と呼ばれる小さなボビーテーブルは、戻ってあなたのデータベースを望んでいた: 'optsの= {「テーブル」:「innocuous_table」、「値」:'10; DROP DATABASE PROD; '} 'また、あなたの辞書リテラルはPythonからではなく、JavaScriptからのものです。 – 9000

+0

javascriptのおかげでありがとうございました。書式設定は内部的には必ずしも問題ではありません(my_arrayとyour_arrayと呼ばれています)し、ほとんどすべての書式設定で同様に有効です。 – Roelant

関連する問題