sto cercando di cambiare la user_version
di un database SQLite tramite Python 2.6, e ho cercato di fare quanto segue:Non è possibile utilizzare la sostituzione del parametro sqlite3 con PRAGMA?
cur.execute("PRAGMA user_version = ?" , (version,))
Viene a mancare con il seguente errore:
cur.execute("PRAGMA user_version = ?" , (version,))
sqlite3.OperationalError: near "?": syntax error
I ho provato lo stile di sostituzione con nome (invece dei punti interrogativi) ma anche quello con lo stesso errore.
Se inserisco un numero all'interno come parte della stringa SQL o utilizzando le operazioni con le stringhe di Python, tutto funziona correttamente, ma preferirei non eseguire nessuna di queste.
Quindi perché non funziona?
E come posso inserire un numero di sicurezza da una variabile in questa chiamata?
Ok, ho pensato, potrebbe essere il caso. Quindi, come posso inserire i valori in modo sicuro? Se il suo uso solo interno è semplice concat di stringa o% di Python accettabile qui? – DMA57361
Questo è un buon metodo per gestire la limitazione quando il parametro è un numero intero. Se invece il parametro di un altro pragma era una stringa, non sarebbe necessario verificare il formato (ad es. Un numero intero come 7 è valido come "7") ma i parametri dovrebbero comunque essere sottoposti a escape per evitare l'iniezione SQL. C'è un modo conveniente per farlo? – spaaarky21
@ spaaarky21: Non sono a conoscenza di alcuna funzione fornita da sqlite3 per fare quoting manuale. Per altri pragma che accettano stringhe, forse il modo più sicuro sarebbe enumerare una whitelist di input ammissibili e controllare l'input dell'utente rispetto a questo set. – unutbu