2009-10-27 13 views
5

Rozumiem, że poprawny sposób sformatować kwerendy SQL w Pythonie jest tak:Jak umieścić sparametryzowane zapytanie sql w zmiennej, a następnie wykonać w Pythonie?

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3) 

tak, że uniemożliwia SQL injection. Moje pytanie brzmi, czy istnieje sposób na umieszczenie zapytania w zmiennej, a następnie wykonanie go? Próbowałem tego przykładu poniżej, ale otrzymałem błąd. Czy można to zrobić?

sql="INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 
cursor.execute(sql) 

Odpowiedz

10

Oto podpis nabór cursor.execute:

Definition: cursor.execute(self, query, args=None) 

    query -- string, query to execute on server 
    args -- optional sequence or mapping, parameters to use with query. 

więc wykonać spodziewa się co najwyżej 3 argumentów (args jest opcjonalny). Jeśli podane są argumenty, oczekuje się, że będą to sekwencje. tak

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 
cursor.execute(*sql_and_params) 

nie będzie działać, ponieważ

cursor.execute(*sql_and_params) 

rozszerza sql_and_params krotka do 4 argumentów (i ponownie wykonać tylko oczekuje, 3).

Jeśli naprawdę musi używać

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 

będziesz musiał złamać ją od siebie, gdy karmienie go cursor.execute:

cursor.execute(sql_and_params[0],sql_and_params[1:]) 

Ale myślę, że czuje się o wiele bardziej przyjemne po prostu użyć dwóch zmienne:

sql = "INSERT INTO table VALUES (%s, %s, %s)" 
args= var1, var2, var3 
cursor.execute(sql, args) 
0

Można spróbować to:

sql="INSERT INTO table VALUES (%s, %s, %s)" 
cursor.execute(sql, var1, var2, var3) 

Ale nie jestem pewien, czy to jest to, czego szukasz. To zależy od tego, czy chcesz wartości jako część zmiennej, czy nie. Jeśli tak, odpowiedź AntsAasma jest prawdopodobnie poprawna.

4

Jesteś całkiem blisko.

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 
cursor.execute(*sql_and_params) 

Gwiazdka oznacza, że ​​zmienna nie jest uważana za jeden parametr, lecz rozpakowana do wielu parametrów.

+0

dlaczego użyłeś ',' zamiast '%'? Na przykład, aby to zrobić: 'sql_and_params =" WSTAW DO WARTOŚCI tabeli (% s,% s,% s) "% (var1, var2, var3)' – bzupnick

+0

@bzupnick za pomocą prostego formatowania napisów (operator '%') lub substytucja potencjalnie umożliwiłaby wstrzyknięcie SQL, nie wspominając o tym, że w razie potrzeby nie dodawał cudzysłowów do literałów. Sparametryzowane zapytania są znacznie lepsze od zapytań sformatowanych/podstawionych. –

Powiązane problemy