Python Glossary English

все 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Сообщить о неточности