Ok, więc nie mam takiego doświadczenia w Pythonie.
Mam następujący kod w Pythonie:
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
gdzie var1
jest liczbą całkowitą, var2
i var3
są łańcuchami.
Jak mogę napisać nazwy zmiennych bez Pythona, włączając je jako część tekstu zapytania?
%
. W rzeczywistości tak mówię w odpowiedzi.%
zamiast,
między ciągiem a zmiennymi .. nie mogę cofnąć mojego głosowania z różnych powodów .. Osobiście chciałbym zobaczyć słowa takie jak niepewny / atak itp. wymienione w opisie, w którym mówisz nie 't use%
..%
operatora do formatowania ciągu. Te%
w łańcuchu są używanecursor.execute
bezpośrednio, a ponieważ wie, że generuje kod SQL, może zrobić więcej, aby Cię chronić.Różne implementacje Python DB-API mogą używać różnych symboli zastępczych, więc musisz dowiedzieć się, którego z nich używasz - może to być (np. Z MySQLdb):
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
lub (np. z sqlite3 ze standardowej biblioteki Pythona):
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
lub jeszcze inne (po
VALUES
tym, jak mogłeś mieć(:1, :2, :3)
lub „nazwane style”(:fee, :fie, :fo)
lub gdy(%(fee)s, %(fie)s, %(fo)s)
przekazujesz dykt zamiast mapy jako drugi argumentexecute
). Sprawdźparamstyle
stałą łańcuchową w module DB API, którego używasz, i poszukaj paramstyle na http://www.python.org/dev/peps/pep-0249/, aby zobaczyć, jakie są wszystkie style przekazywania parametrów!źródło
Wiele sposobów. NIE używaj najbardziej oczywistego (
%s
z%
) w prawdziwym kodzie, jest on otwarty na ataki .Tutaj skopiuj i wklej z pydoc z sqlite3 :
# Never do this -- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Do this instead t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t) print c.fetchone() # Larger example that inserts many records at a time purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ] c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
Więcej przykładów, jeśli potrzebujesz:
# Multiple values single statement/execution c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO')) print c.fetchall() c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO')) print c.fetchall() # This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice. c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO') print c.fetchall() # Insert a single item c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
źródło
http://www.amk.ca/python/writing/DB-API.html
Zachowaj ostrożność, gdy po prostu dołączasz wartości zmiennych do swoich instrukcji: Wyobraź sobie użytkownika nazywającego siebie
';DROP TABLE Users;'
- dlatego musisz użyć funkcji ucieczki sql, którą Python zapewnia ci, gdy używasz kursor.execute w przyzwoity sposób. Przykład w adresie URL to:cursor.execute("insert into Attendees values (?, ?, ?)", (name, seminar, paid) )
źródło