Anda menggunakan pemformatan string Python dan ini adalah Ide Sangat Buruk (TM). Pikirkan injeksi SQL. Cara yang tepat untuk melakukannya adalah dengan menggunakan variabel terikat:
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))
di mana tupel parameter diberikan sebagai argumen kedua ke execute()
. Anda juga tidak perlu melarikan diri dari nilai apa pun, psycopg2 akan melakukan pelarian untuk Anda. Dalam kasus khusus ini juga disarankan untuk tidak meneruskan nama tabel dalam suatu variabel (escaped_name
) tetapi untuk menyematkannya dalam string kueri:psycopg2 tidak tahu cara mengutip nama tabel dan kolom, hanya nilai.
Lihat dokumentasi psycopg2:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
Jika Anda ingin membuat pernyataan SQL secara terprogram, cara yang biasa digunakan adalah menggunakan pemformatan Python untuk pernyataan dan pengikatan variabel untuk argumen. Misalnya, jika Anda memiliki nama tabel di escaped_name
Anda dapat melakukan:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
Jelas, untuk menggunakan placeholder dalam kueri Anda, Anda perlu mengutip %
yang memperkenalkan argumen terikat dalam format pertama.
Perhatikan bahwa ini aman jika dan hanya jika escaped_name
dihasilkan oleh kode Anda mengabaikan input eksternal apa pun (misalnya nama dasar tabel dan penghitung) tetapi berisiko injeksi SQL jika Anda menggunakan data yang disediakan oleh pengguna.