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:
для создания базы данных в оперативной памяти.
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)