Psycopg2 Inserire Nella Tabella dei Segnaposto

Questa potrebbe essere una domanda piuttosto sciocca ma che cosa sto facendo di sbagliato? Crea la tabella, ma INSERTO IN non funziona, credo che lo sto facendo qualcosa di sbagliato con i segnaposto?

conn = psycopg2.connect("dbname=postgres user=postgres")
cur = conn.cursor()
escaped_name = "TOUR_2"
cur.execute('CREATE TABLE %s(id serial PRIMARY KEY, day date, elapsed_time varchar,    net_time varchar, length float, average_speed float, geometry GEOMETRY);' % escaped_name)

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))

conn.commit()
cur.close()
conn.close()

INSERT INTO chiamata non funziona, mi dà

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))
psycopg2.ProgrammingError: syntax error at or near ":"
LINE 1: ...h, average_speed, geometry) VALUES (2013/09/01 , 2:56:59, 02...

Qualcuno mi può aiutare su questo? Grazie mille!



2 Replies
  1. 29

    Si utilizza Python stringa di formattazione e questa è una pessima Idea (TM). Pensare di SQL-injection. Il modo giusto per farlo è quello di utilizzare 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 è dato come secondo argomento execute(). Inoltre non c’è bisogno di sfuggire ad ogni valore, psycopg2 fare l’escape per voi. In questo caso particolare è anche suggerito di non passare il nome della tabella in una variabile ( escaped_name ), ma anche a inserire nella stringa di query: psycopg2 non so come citare nomi di tabelle e colonne, solo i valori.

    Vedere psycopg2 documentazione:

    http://www.psycopg.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

    Se si desidera generare a livello di codice l’istruzione SQL, il modo più comune è quello di utilizzare Python formattazione per l’istruzione e la variabile vincolante per gli argomenti. Per esempio, se avete il nome della tabella in escaped_name si può fare:

    query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
    curs.execute(query, args_tuple)

    Ovviamente, per utilizzare i segnaposto per la tua ricerca è bisogno di citare qualsiasi % che introdurre un limite argomento in primo formato.

    Nota che questo è sicuro se e solo se escaped_name è generato dal codice ignorando qualsiasi input esterno (ad esempio una tabella di base nome e un contatore), ma è a rischio di SQL injection se si utilizzano i dati forniti dall’utente.

    • +1 Per citare il doc: “Attenzione mai, mai, Mai, usare Python di concatenazione di stringhe (+) o stringa di parametri di interpolazione (%) per passare le variabili di una stringa di query SQL. Nemmeno sotto minaccia.
    • Grazie nebbia, adesso ho capito. Stavo cercando una soluzione, perché voglio automatizzare il processo di creazione di una tabella con un numero progressivo, io. e. TOUR+’i’, dove ‘i’ sarebbe un numero e non sempre scrivere una nuova istruzione SQL. Se hai qualche idea di come fare questo?
    • Il modo più comune per “automaticamente” generare SQL è quello di utilizzare Python formattazione per creare l’istruzione e variabile vincolante per passare gli argomenti. Vedere il mio aggiornati risposta.
    • Grazie ancora nebbia, ora funziona utilizzando il %% per i miei valori e non solo la %. Non riuscivo a trovare niente a riguardo di questo sul web. Il secondo % dirige la dichiarazione di afferrare i valori dal mio secondo parametri, in questo caso il args_tuple, giusto?
    • Nascosto nel documenti: When parameters are used, in order to include a literal % in the query you can use the %% string
    • Perché le frasi “Il modo giusto per farlo..” e “In questo caso particolare..” si contraddicono a vicenda, con un esempio nell’ex frase di come fare qualcosa con l’ultima frase indica che è impossibile? -1

Lascia un commento