Desidero passare i parametri di query al metodo cursor.execute()
di MySQLdb
come dizionario con nome, in modo che siano con escape dall'iniezione SQL.Python MySQLdb: parametri di query come dizionario con nome
si può spiegare il motivo per cui questo dà KeyError:
>>>c.execute('select id from users where username=%(user)s', {'user':'bob',})
KeyError: 'user'
manuale MySQLdb http://mysql-python.sourceforge.net/MySQLdb.html dice:
* paramstyle
costante stringa che specifica il tipo di marcatore di parametro formattazione atteso dall'interfaccia. Impostare su "formato" = codici di formato printf ANSI C, ad es. '... WHERE name =% s'. Se viene utilizzato un oggetto di mapping per conn.execute(), l'interfaccia utilizza effettivamente "pyformat" = codici di estensione del codice Python, ad es. '... WHERE name =% (name) s'. Tuttavia, l'API non attualmente consente la specificazione di più di uno stile in paramstyle *
Sto inserendo un valore *** di colonna ***. La riga nella documentazione indica che il seguente codice non è valido: 'c.execute ('seleziona id da% s dove username =% s', ('users', 'bob'))' – mercador
@mercador Right, the 'dal pezzo di% s' è ciò che sta causando l'errore dal momento che si sta tentando di parametrizzare il nome della tabella. Il vantaggio dell'uso di 'execute' in questo modo è che aiuta a prevenire l'SQL injection, ma se si adottano le opportune precauzioni di sicurezza (che non sono un esperto, ma comportano una corretta sanitizzazione/fuga dei parametri), è possibile usa la formattazione di stringhe incorporate di Python per costruire la query e poi passala a 'execute'. Ancora una volta, l'iniezione SQL è la preoccupazione principale. Spero che questo ti aiuti! – RocketDonkey