PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Psycopg2 Inserisci nella tabella con segnaposto

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.