Stai usando la formattazione delle stringhe Python e questa è una Very Bad Idea (TM). Pensa all'iniezione SQL. Il modo giusto per farlo è usare le variabili associate:
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))
dove la tupla di parametri è data come secondo argomento a execute()
. Inoltre non è necessario eseguire l'escape di alcun valore, psycopg2 eseguirà l'escape per te. In questo caso particolare si suggerisce anche di non passare il nome della tabella in una variabile (escaped_name
) ma per incorporarlo nella stringa di query:psycopg2 non sa come citare nomi di tabelle e colonne, solo valori.
Vedi la documentazione di psycopg2:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
Se si desidera generare a livello di codice l'istruzione SQL, il modo consueto consiste nell'utilizzare la formattazione Python per l'istruzione e l'associazione di variabili per gli argomenti. Ad esempio, se hai il nome della tabella in escaped_name
puoi fare:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
Ovviamente, per utilizzare i segnaposto nella tua query devi citare qualsiasi %
che introducono un argomento legato nel primo formato.
Nota che questo è sicuro se e solo se escaped_name
viene generato dal tuo codice ignorando qualsiasi input esterno (ad esempio un nome di base di una tabella e un contatore) ma è a rischio di SQL injection se utilizzi i dati forniti dall'utente.