Używasz formatowania napisów w Pythonie i jest to bardzo zły pomysł (TM). Pomyśl o wstrzykiwaniu SQL. Właściwym sposobem na to jest użycie powiązanych zmiennych:
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))
gdzie krotka parametrów jest podana jako drugi argument funkcji execute()
. Nie musisz też uciekać od żadnej wartości, psycopg2 zrobi to za Ciebie. W tym konkretnym przypadku sugeruje się również, aby nie przekazywać nazwy tabeli w zmiennej (escaped_name
), ale aby umieścić go w ciągu zapytania:psycopg2 nie umie cytować nazw tabel i kolumn, tylko wartości.
Zobacz dokumentację psycopg2:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
Jeśli chcesz programowo wygenerować instrukcję SQL, zwyczajowym sposobem jest użycie formatowania Pythona dla instrukcji i powiązania zmiennych dla argumentów. Na przykład, jeśli masz nazwę tabeli w escaped_name
możesz zrobić:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
Oczywiście, aby użyć symboli zastępczych w zapytaniu, musisz zacytować dowolny %
które wprowadzają powiązany argument w pierwszym formacie.
Pamiętaj, że jest to bezpieczne jeśli i tylko wtedy escaped_name
jest generowany przez kod ignorujący wszelkie zewnętrzne dane wejściowe (na przykład nazwę bazy tabeli i licznik), ale istnieje ryzyko wstrzyknięcia kodu SQL, jeśli użyjesz danych dostarczonych przez użytkownika.