Domanda

Sto cercando di assemblare la seguente istruzione SQL tramite db-API di Python:

SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';

dove BEGINNING_OF_STRING dovrebbe essere un pitone var da riempire in modo sicuro attraverso il DB-API. Ho cercato

beginningOfString = 'abc'

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString) 
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)

Sono a corto di idee; qual è il modo corretto di fare questo?

È stato utile?

Soluzione

E 'meglio per separare i parametri da SQL se potete. Poi si può lasciare che il db modulo di prendersi cura di una corretta citazione dei parametri.

sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)

Altri suggerimenti

Modifica

Come hanno notato anche Brian e Thomas, il molto il modo migliore per farlo sarebbe quello di utilizzare:

beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )

dal momento che il primo metodo lascia si apre ad attacchi di SQL injection.


A sinistra in per la storia:

Prova:

cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)

Prendere nota di Sqlite3 documentazione:

  

Di solito le operazioni di SQL avranno bisogno   di utilizzare i valori dalle variabili Python.   Non si dovrebbe assemblare la query   usando operazioni sulle stringhe di Python   perché così facendo è insicuro; esso rende   il programma vulnerabile ad uno SQL   attacco iniezione.

     

Al contrario, utilizzare il parametro della DB-API   sostituzione. Mettere ? come segnaposto   ovunque si desidera utilizzare un valore, e   quindi fornire una tupla di valori come   secondo argomento al cursore di   eseguire il metodo (). (Altro database   I moduli possono utilizzare un diverso   segnaposto, ad esempio% s o. 1) Per   Esempio:

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)

Penso che si desidera in questo modo:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top