2010-09-11 16 views
15

In questo post about SQLite, aaronasterling mi ha detto che"% s"% format vs "{0}". Format() vs "?" Formato

  • cmd = "attach \"%s\" as toMerge" % "b.db": è sbagliato
  • cmd = 'attach "{0}" as toMerge'.format("b.db"): è corretto
  • cmd = "attach ? as toMerge"; cursor.execute(cmd, ('b.db',)): è cosa giusta

Ma, ho pensato che la prima e il secondo è lo stesso. Quali sono le differenze tra questi tre?

+0

scusa per non aver chiarito nella mia risposta. Sembrava già troppo lungo;) – aaronasterling

+0

@aaronasterling: Oh, ho solo pensato che questo post potesse valere una pagina. Grazie per le risposte e l'aiuto. – prosseek

risposta

17
"attach \"%s\" as toMerge" % "b.db" 

Si consiglia di utilizzare ' invece di ", quindi non c'è bisogno di fuggire.

Hai usato le vecchie stringhe di formattazione che sono deprecate.

'attach "{0}" as toMerge'.format("b.db") 

Questo utilizza la nuova funzione di stringa di formato dalle versioni Python più recenti che dovrebbero essere utilizzate al posto di quella vecchia se possibile.

"attach ? as toMerge"; cursor.execute(cmd, ('b.db',)) 

Questo omette la formattazione della stringa completamente e utilizza invece una funzione SQLite, quindi questo è il modo giusto per farlo.

Grande vantaggio: nessun rischio di SQL injection

3

Perché non viene scappato. Se hai sostituito b.db con l'input dell'utente, ti lascerebbe vulnerabile all'iniezione SQL.

6

Il primo e il secondo producono lo stesso risultato, ma il secondo metodo è preferibile per la formattazione delle stringhe nelle versioni più recenti di Python.

Tuttavia, il terzo è l'approccio migliore qui perché utilizza i parametri invece di manipolare le stringhe. Questo è sia più veloce che più sicuro.

+2

il secondo metodo, essendo preferito nelle versioni più recenti di python è, per estensione, preferito per il nuovo codice in tutte le versioni di python che lo supportano. È una semplice questione di compatibilità diretta – aaronasterling