SQLITE3 - DB-API 2.0 interface for SQLite databases
SQLite - это библиотека C, которая предоставляет легковесную дисковую базу данных, не требующую отдельного серверного процесса и позволяющую получить доступ к базе данных с использованием нестандартного варианта языка запросов SQL. Некоторые приложения могут использовать SQLite для внутреннего хранения данных. Также возможно создать прототип приложения с использованием SQLite, а затем перенести код в большую базу данных, такую как PostgreSQL или Oracle.Модуль sqlite3 был написан Герхардом Херингом. Он предоставляет интерфейс SQL, соответствующий спецификации DB-API 2.0, описанной в PEP 249.
Что бы использовать этот модуль, вы должны сначала создать объект типа
Connection
,
который и будет представлять базу
данных. Здесь у нас данные будут
запоминаться в файле с именем example.db
:import sqlite3 conn = sqlite3.connect('example.db')
Что бы создать базу данных в оперативной памяти (RAM), указажите специальное имя
:memory:
вместо
имени файла
.Раз есть объект
Connection
,
можно создать объект Cursor
и из него вызвать метод execute()
для выполнения команд SQL:c = conn.cursor()
# Создаем таблицу
c.execute('''CREATE TABLE stocks
(date text, trans text, symbol text, qty real, price real)''')
# Вставляем строку данных
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
# Сохраняем (commit) изменения
conn.commit()
# Если мы закончили работу с базой, мы можем закрыть связь.
# Мы должны быть уверены в том, что все изменения сохранены в базе,
# иначе они пропадут.
conn.close()
Данные, которые мы сохранили, постоянно записаны на диске и будут доступны в следующей сессии:
import sqlite3 conn = sqlite3.connect('example.db') c = conn.cursor()
Обычно ваши операции на языке SQL будут требовать значения из переменных Python. Вы не должны собирать запросы используя строковые операции языка Python потому что это небезопасно; это делает вашу программу уязвимой для атаки SQL-инъекцией (см. https://xkcd.com/327/ для юмористического примера того, что может пойти не так).
Вместо этого, используйте подстановку параметров DB-API. Поместите символ
?
Там где хотите использовать значение,
а потом подставьте набор значений как
второй аргумент в метод execute()
.
(Другие модули баз данных могут
использовать другие символа, такие как
%s
или :1
.)
Например:# Никогда не делайте так- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Вместо этого делайте так t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t) print(c.fetchone()) # Пример вставки нескольких записей за один раз 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)
После выполения предложения SELECT, вы можете или трактовать курсор как итератор (iterator), или вызвать метод из курсора
fetchone()
для получения одной записи за раз, или
получить список всех удовлетворяющих
запросу записей, вызвав метод fetchall()
.Этот пример использует форму итератора:
>>>
>>> for row in c.execute('SELECT * FROM stocks ORDER BY price'): print(row) ('2006-01-05', 'BUY', 'RHAT', 100, 35.14) ('2006-03-28', 'BUY', 'IBM', 1000, 45.0) ('2006-04-06', 'SELL', 'IBM', 500, 53.0) ('2006-04-05', 'BUY', 'MSFT', 1000, 72.0)