Python文字列フォーマットを使用していますが、これは非常に悪いアイデア(TM)です。 SQLインジェクションを考えてください。それを行う正しい方法は、束縛変数を使用することです:
cur.execute('INSERT INTO %s (day, elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day, time_length, time_length_net, length_km, avg_speed, myLine_ppy))
ここで、パラメーターのタプルはexecute()
の2番目の引数として指定されます 。また、値をエスケープする必要はありません。psycopg2がエスケープを行います。この特定のケースでは、変数(escaped_name
でテーブル名を渡さないこともお勧めします )ただし、クエリ文字列に埋め込むには、psycopg2はテーブル名と列名を引用する方法を認識せず、値のみを認識します。
psycopg2のドキュメントを参照してください:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
プログラムでSQLステートメントを生成する場合、通常の方法は、ステートメントにPython形式を使用し、引数に変数バインディングを使用することです。たとえば、escaped_name
にテーブル名がある場合 あなたができること:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
明らかに、クエリでプレースホルダーを使用するには、%
を引用符で囲む必要があります 最初の形式でバインドされた引数を導入します。
これは次の場合にのみ安全であることに注意してください escaped_name
は外部入力(テーブルベース名やカウンターなど)を無視してコードによって生成されますが、ユーザーから提供されたデータを使用するとSQLインジェクションのリスクがあります。