SQLite
- это библиотека языка C, которая предоставляет легковесную дисковую базу данных. База данных SQLite
не требует отдельного серверного процесса и позволяет получить доступ к базе данных, используя нестандартный вариант языка запросов SQL
.
Некоторые приложения могут использовать SQLite
для внутреннего хранения данных. Также возможно создать прототип приложения с использованием SQLite
, а затем перенести код в большую базу данных, такую как PostgreSQL
или Oracle
.
Модуль sqlite3
обеспечивает интерфейс SQL
, совместимый со спецификацией DB-API 2.0, описанной в PEP 249.
В старых версиях SQLite возникали проблемы с разделением соединений между потоками. По этому модуль sqlite3
Python запрещает разделять соединения и курсоры между потоками. Если попытаться это сделать, то получим исключение во время выполнения.
Единственным методом, имеющим смысл вызывать только из другого потока является вызов метода connect.interrupt()
.
Чтобы использовать модуль, необходимо сначала создать объект Connection
, который представляет базу данных. В примерах, данные будут храниться в файле example.db
:
import sqlite3 conn = sqlite3.connect('example.db')
Можно также указать специальное имя :memory:
для создания базы данных в оперативной памяти.
Получив соединение Connection
, можно создать объект Cursor
и вызвать его метод cursor.execute()
для выполнения команд SQL:
cursor = conn.cursor() # Создать таблицу cursor.execute('''CREATE TABLE stocks (date text, trans text, symbol text, qty real, price real)''') # Вставить строку данных cursor.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)") # Сохранить (зафиксировать) изменения conn.commit() # Можно закрыть соединение, если оно больше не нужно. # Убедитесь, что все изменения были зафиксированы, или они будут потеряны. conn.close()
Данные, которые были сохранены, являются постоянными и доступны в следующих сеансах:
import sqlite3 conn = sqlite3.connect('example.db') cursor = conn.cursor()
Обычно операции SQL
могут использовать значения из переменных в Python. Нет необходимости собирать запрос, используя строковые операции Python, потому что это небезопасно. Это делает программу уязвимой для атаки SQL-инъекцией.
Вместо этого используйте подстановку параметров DB-API. Поставьте символ '?'
в качестве заполнителя везде, где вы хотите использовать значение переменной, а затем предоставьте кортеж значений в качестве второго аргумента метода курсора cursor.execute()
. Другие модули базы данных могут использовать другой заполнитель, такой как '%s'
или ':1'
.
Например:
# Никогда не делай этого - небезопасно! symbol = 'RHAT' cursor.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Делайте все время так, как показано ниже. t = ('RHAT',) cursor.execute('SELECT * FROM stocks WHERE symbol=?', t) print(cursor.fetchone()) # Larger example that inserts many records at a time purchases = [('2020-03-28', 'BUY', 'IBM', 1000, 45.00), ('2020-04-05', 'BUY', 'MSFT', 1000, 72.00), ('2020-04-06', 'SELL', 'IBM', 500, 53.00), ] cursor.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
Чтобы получить данные после выполнения оператора SELECT
, можно либо обработать курсор как итератор, вызвать метод курсора cursor.fetchone()
, чтобы получить единственную совпадающую строку, либо вызвать cursor.fetchall()
, чтобы получить список совпадающих строк.
В этом примере используется форма итератора:
>>> for row in cursor.execute('SELECT * FROM stocks ORDER BY price'): ... print(row) ... # ('2020-01-05', 'BUY', 'RHAT', 100, 35.14) # ('2020-03-28', 'BUY', 'IBM', 1000, 45.0) # ('2020-04-06', 'SELL', 'IBM', 500, 53.0) # ('2020-04-05', 'BUY', 'MSFT', 1000, 72.0)