Използвате форматиране на низове на 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()
. Също така не е нужно да избягвате каквато и да е стойност, 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 инжекция, ако използвате данни, предоставени от потребителя.