все Python 3sqlite3понятие
sqlite3.Cursor
соединение и запросы
Курсор выполняет SQL-запросы и отдаёт результат: fetchone(), fetchmany(), fetchall() или перебор в цикле for.
Синтаксис
cur = conn.cursor(); cur.execute(sql, params); cur.fetchall()
Значения подставляйте через знаки ? и кортеж параметров, а не f-строкой: f"... WHERE name = '{name}'" открывает SQL-инъекцию, а ? экранирует всё сам. Один параметр — всё равно кортеж: ('ann',), а не 'ann' — строка из трёх букв даст три параметра и ProgrammingError. Курсор одноразовый: после fetchall() следующий fetchone() вернёт None. Placeholder ? подставляет значения, но не имена таблиц и столбцов.
Примеры
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE users(name, secret)')
conn.execute("INSERT INTO users VALUES ('ann', 'pin1'), ('bob', 'pin2')")
name = "x' OR '1'='1" # «имя» от злоумышленника
bad = conn.execute(f"SELECT secret FROM users WHERE name = '{name}'")
print(len(bad.fetchall())) # → 2 — инъекция вытащила всё
good = conn.execute('SELECT secret FROM users WHERE name = ?', (name,))
print(len(good.fetchall())) # → 0
conn.close()
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE u(name)')
cur.executemany('INSERT INTO u VALUES (?)', [('ann',), ('bob',)])
print(cur.rowcount) # → 2
print(cur.execute('SELECT name FROM u').fetchall(), cur.fetchone()) # → [('ann',), ('bob',)] None
try:
cur.execute('SELECT * FROM u WHERE name = ?', 'ann')
except sqlite3.ProgrammingError as e:
print(e) # → Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied.
conn.close()
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности