SQLite3 for Python

54
SQLite3 for Python Методы и средства проектирования информационных систем

Transcript of SQLite3 for Python

Page 1: SQLite3 for Python

SQLite3 for PythonМетоды и средства проектирования информационных систем

Page 2: SQLite3 for Python

SQLite

SQLite — компактная встраиваемая СУБД. Исходный код библиотеки

передан в общественное достояние. В 2005 году проект получил награду

Google-O’Reilly Open Source Awards.

2

Page 3: SQLite3 for Python

Устройство

Слово «встраиваемый» (embedded) означает, что SQLite не использует

парадигму клиент-сервер, то есть движок SQLite не является отдельно

работающим процессом, с которым взаимодействует программа, а

представляет собой библиотеку, с которой программа компонуется, и

движок становится составной частью программы. Таким образом, в

качестве протокола обмена используются вызовы функций (API)

библиотеки SQLite.

3

Page 4: SQLite3 for Python

Устройство

Такой подход уменьшает накладные расходы, время отклика и упрощает

программу. SQLite хранит всю базу данных (включая определения,

таблицы, индексы и данные) в единственном стандартном файле на том

компьютере, на котором исполняется программа. Простота реализации

достигается за счёт того, что перед началом исполнения транзакции

записи весь файл, хранящий базу данных, блокируется; ACID-функции

достигаются в том числе за счёт создания файла журнала.

4

Page 5: SQLite3 for Python

Устройство

Несколько процессов или потоков могут одновременно без каких-либо

проблем читать данные из одной базы. Запись в базу можно осуществить

только в том случае, если никаких других запросов в данный момент не

обслуживается; в противном случае попытка записи оканчивается

неудачей, и в программу возвращается код ошибки. Другим вариантом

развития событий является автоматическое повторение попыток записи в

течение заданного интервала времени.

5

Page 6: SQLite3 for Python

Устройство

В комплекте поставки идёт также функциональная клиентская часть в

виде исполняемого файла sqlite3, с помощью которого демонстрируется

реализация функций основной библиотеки. Клиентская часть является

кроссплатформенной утилитой командной строки.

SQLite возможно использовать как на встраиваемых системах, так и на

выделенных машинах с гигабайтными массивами данных.

6

Page 7: SQLite3 for Python

Архитектура SQLite

7

Page 8: SQLite3 for Python

Типы данных

SQLite поддерживает динамическое типизирование данных. Возможные

типы значений: INTEGER, REAL, TEXT и BLOB. Также поддерживается

специальное значение NULL.

Размеры значений типа TEXT и BLOB не ограничены ничем, кроме

константы SQLITE_MAX_LENGTH в исходниках sqlite, равной миллиарду

(10^9).

8

Page 9: SQLite3 for Python

Типы данных

Каждое значение в любом поле любой записи может быть любого из этих

типов, независимо от типа, указанного при объявлении полей таблицы.

Указанный при объявлении поля тип хранится для справки в его исходном

написании, и используется в качестве основы для выбора предпочтений

(так называемое «type affinity»: это подход, редко встречающийся в

других СУБД) при выполнении неявных преобразований типов на

основании похожести этого названия типа на что-либо, знакомое SQLite.

9

Page 10: SQLite3 for Python

Типы данных

В этот алгоритм зашит обширный перечень практикуемых в других СУБД

вариантов названий типов данных. Если безопасного преобразования

записываемого значения в предпочитаемый тип не получается, SQLite

записывает значение в его исходном виде. Для получения значений из

базы есть ряд функций для каждого из типов, и если тип хранимого

значения не соответствует запрашиваемому, оно тоже, по возможности,

преобразуется.

10

Page 11: SQLite3 for Python

Ограничения

Старые версии SQLite были спроектированы без каких-либо ограничений,

единственным условием было то, чтобы база данных умещалась в памяти,

в которой все вычисления производились при помощи 32-разрядных целых

чисел. Это создавало определённые проблемы. Из-за того, что верхние

пределы не были определены и соответственно должным образом

протестированы, часто обнаруживались ошибки при использовании SQLite

в достаточно экстремальных условиях. Поэтому в новых версиях SQLite

были введены пределы, которые теперь проверяются вместе с общим

набором тестов.

11

Page 12: SQLite3 for Python

Ограничения

Во время компиляции библиотеки SQLite устанавливаются следующие

ограничения, которые можно, при острой необходимости, увеличивать:

12

Page 13: SQLite3 for Python

Ограничения

На текущий момент только значение SQLITE_MAX_PAGE_SIZE не может быть

больше заданного по умолчанию. Таким образом, не изменяя

SQLITE_MAX_PAGE_COUNT, можно сказать, что максимальный размер

файла базы данных составляет примерно 140 ТБ (2^47 Б).

Некоторые ограничения можно менять в сторону уменьшения во время

исполнения программы при помощи задания категории и

соответствующего значения функции sqlite3_limit():

int sqlite3_limit(sqlite3*, int id, int newVal)

Это может быть полезным, если SQLite используется в веб-приложениях,

так как уменьшенные пределы могут предотвратить DoS-атаки со стороны

недоверяемых внешних клиентов.

13

Page 14: SQLite3 for Python

Использование

Сама библиотека SQLite написана на C; существует большое количество

привязок к другим языкам программирования, в том числе Apple Swift,

Delphi, C++, Java, C#, VB.NET, Python, Perl, Node.js, PHP, PureBasic, Tcl

(средства для работы с Tcl включены в комплект поставки SQLite), Ruby,

Haskell, Scheme, Smalltalk, Lua и Parser, а также ко многим другим.

Полный список существующих средств размещён на странице проекта.

14

Page 15: SQLite3 for Python

Использование

Простота и удобство встраивания SQLite привели к тому, что библиотека

используется в браузерах, музыкальных плеерах и многих других

программах.

В частности, SQLite используется в:

Adobe Integrated Runtime — среда для запуска приложений (частично);

Gears;

Autoit;

Фреймворк Qt;

15

Page 16: SQLite3 for Python

Использование

Платформа XUL на движке Gecko 1.9+, XULRunner 1.9+ и, потенциально,

все приложения, основанные на этой платформе, в том числе:

Mozilla Firefox (начиная с версии 3.0)

Mozilla Thunderbird (начиная с версии 3.0)

Songbird

SQLite Manager.

Skype;

Viber;

Некоторые модели GPS-навигаторов Garmin

16

Page 17: SQLite3 for Python

Использование

Многие программы поддерживают SQLite в качестве формата хранения

данных (особенно в Mac OS и iOS, Android), в том числе:

1С:Предприятие 7.7 (с помощью внешнего компонента);

1С:Предприятие 8.3 (для хранения записей журнала регистрации);

Adobe Photoshop Lightroom;

FlylinkDC++;

AIMP;

Banshee;

И другие.

17

Page 18: SQLite3 for Python

Создание соединения

Чтобы воспользоваться SQLite3 в Python необходимо импортировать

модуль sqlite3, а затем создать объект подключения к БД.

Объект подключения создается с помощью метода connect():

import sqlite3

con = sqlite3.connect('mydatabase.db')

18

Page 19: SQLite3 for Python

Курсор SQLite3

Для выполнения операторов SQL, нужен объект курсора, создаваемый

методом cursor().

Курсор SQLite3 – это метод объекта соединения. Для выполнения

операторов SQLite3 сначала устанавливается соединение, а затем

создается объект курсора с использованием объекта соединения

следующим образом:

con = sqlite3.connect('mydatabase.db')

cursorObj = con.cursor()

Теперь можно использовать объект курсора для вызова метода execute()

для выполнения любых запросов SQL.

19

Page 20: SQLite3 for Python

Создание базы данных

После создания соединения с SQLite, файл БД создается автоматически,

при условии его отсутствия. Этот файл создается на диске, но также

можно создать базу данных в оперативной памяти, используя параметр

«:memory:» в методе connect. При этом база данных будет называется

инмемори.

Рассмотрим приведенный ниже код, в котором создается БД с блоками try,

except и finally для обработки любых исключений:

20

Page 21: SQLite3 for Python

Создание базы данных

import sqlite3

from sqlite3 import Error

def sql_connection():

try:

con = sqlite3.connect(':memory:')

print("Connection is established: Database is created in memory")

except Error:

print(Error)

finally:

con.close()

sql_connection()

21

Page 22: SQLite3 for Python

Создание базы данных

Сначала импортируется модуль sqlite3, затем определяется функция с

именем sql_connection. Внутри функции определен блок try, где метод

connect() возвращает объект соединения после установления соединения.

Затем определен блок исключений, который в случае каких-либо

исключений печатает сообщение об ошибке. Если ошибок нет, соединение

будет установлено, тогда скрипт распечатает текст «Connection is

established: Database is created in memory».

Далее производится закрытие соединения в блоке finally. Закрытие

соединения необязательно, но это хорошая практика программирования,

позволяющая освободить память от любых неиспользуемых ресурсов.

22

Page 23: SQLite3 for Python

Создание таблицы

Чтобы создать таблицу в SQLite3, выполним запрос Create Table в методе

execute(). Для этого выполним следующую последовательность шагов:

Создание объекта подключения

Объект Cursor создается с использованием объекта подключения

Используя объект курсора, вызывается метод execute с запросом create

table в качестве параметра.

Давайте создадим таблицу Employees со следующими колонками:

employees (id, name, salary, department, position, hireDate)

Код будет таким:

23

Page 24: SQLite3 for Python

Создание таблицы

import sqlite3

from sqlite3 import Error

def sql_connection():

try:

con = sqlite3.connect('mydatabase.db')

return con

except Error:

print(Error)

def sql_table(con):

cursorObj = con.cursor()

cursorObj.execute("CREATE TABLE employees(id integer PRIMARY KEY, name text, salary real, department text, position text, hireDate text)")

con.commit()

con = sql_connection()

sql_table(con)

24

Page 25: SQLite3 for Python

Создание таблицы

В приведенном выше коде определено две функции: первая

устанавливает соединение; а вторая - используя объект курсора

выполняет SQL оператор create table.

Метод commit() сохраняет все сделанные изменения. В конце скрипта

производится вызов обеих функций.

Для проверки существования таблицы воспользуемся браузером БД для

sqlite.

25

Page 26: SQLite3 for Python

Вставка данных в таблицу

Чтобы вставить данные в таблицу воспользуемся оператором INSERT INTO.

Рассмотрим следующую строку кода:

cursorObj.execute("INSERT INTO employees VALUES(1, 'John', 700, 'HR',

'Manager', '2017-01-04')")

Также можем передать значения / аргументы в оператор INSERT в методе

execute (). Также можно использовать знак вопроса (?) в качестве

заполнителя для каждого значения. Синтаксис INSERT будет выглядеть

следующим образом:

26

Page 27: SQLite3 for Python

Вставка данных в таблицу

cursorObj.execute('''INSERT INTO employees(id, name, salary, department,

position, hireDate) VALUES(?, ?, ?, ?, ?, ?)''', entities)

Где картеж entities содержат значения для заполнения одной строки в

таблице:

entity = (2, 'Andrew', 800, 'IT', 'Tech', '2018-02-06')

Код выглядит следующим образом:

27

Page 28: SQLite3 for Python

Вставка данных в таблицу

import sqlite3

con = sqlite3.connect('mydatabase.db')

def sql_insert(con, entities):

cursorObj = con.cursor()

cursorObj.execute('INSERT INTO employees(id, name, salary, department,

position, hireDate) VALUES(?, ?, ?, ?, ?, ?)', entities)

con.commit()

entities = (2, 'Andrew', 800, 'IT', 'Tech', '2018-02-06')

sql_insert(con, entities)

28

Page 29: SQLite3 for Python

Обновление таблицы

Предположим, что нужно обновить имя сотрудника, чей идентификатор

равен 2. Для обновления будем использовать инструкцию UPDATE. Также

воспользуемся предикатом WHERE в качестве условия для выбора нужного

сотрудника.

Рассмотрим следующий код:

29

Page 30: SQLite3 for Python

Обновление таблицы

import sqlite3

con = sqlite3.connect('mydatabase.db')

def sql_update(con):

cursorObj = con.cursor()

cursorObj.execute('UPDATE employees SET name = "Rogers" where id = 2')

con.commit()

sql_update(con)

Это изменит имя Эндрю на Роджерс.

30

Page 31: SQLite3 for Python

Оператор SELECT

Оператор SELECT используется для выборки данных из одной или более

таблиц. Если нужно выбрать все столбцы данных из таблицы, можете

использовать звездочку (*). SQL синтаксис для этого будет следующим:

select * from table_name

В SQLite3 инструкция SELECT выполняется в методе execute объекта

курсора. Например, выберем все стрики и столбцы таблицы employee:

cursorObj.execute('SELECT * FROM employees ')

Если нужно выбрать несколько столбцов из таблицы, укажем их, как

показано ниже:

31

Page 32: SQLite3 for Python

Оператор SELECT

select column1, column2 from tables_name

Например,

cursorObj.execute('SELECT id, name FROM employees')

Оператор SELECT выбирает все данные из таблицы employees БД.

32

Page 33: SQLite3 for Python

Выборка всех данных

Чтобы извлечь данные из БД выполним инструкцию SELECT, а затем

воспользуемся методом fetchall() объекта курсора для сохранения

значений в переменной. При этом переменная будет являться списком,

где каждая строка из БД будет отдельным элементом списка. Далее будет

выполняться перебор значений переменной и печатать значений.

Код будет таким:

33

Page 34: SQLite3 for Python

Выборка всех данных

import sqlite3

con = sqlite3.connect('mydatabase.db')

def sql_fetch(con):

cursorObj = con.cursor()

cursorObj.execute('SELECT * FROM employees')

rows = cursorObj.fetchall()

for row in rows:

print(row)

sql_fetch(con)

34

Page 35: SQLite3 for Python

Выборка всех данных

Также можно использовать fetchall() в одну строку:

[print(row) for row in cursorObj.fetchall()]

Если нужно извлечь конкретные данные из БД, воспользуйтесь

предикатом WHERE. Например, выберем идентификаторы и имена тех

сотрудников, чья зарплата превышает 800. Для этого заполним нашу

таблицу большим количеством строк, а затем выполним запрос.

Можете использовать оператор INSERT для заполнения данных или ввести

их вручную в программе браузера БД.

Теперь, выберем имена и идентификаторы тех сотрудников, у кого

зарплата больше 800:

35

Page 36: SQLite3 for Python

Выборка всех данных

import sqlite3

con = sqlite3.connect('mydatabase.db')

def sql_fetch(con):

cursorObj = con.cursor()

cursorObj.execute('SELECT id, name FROM employees WHERE salary >

800.0')

rows = cursorObj.fetchall()

for row in rows:

print(row)

sql_fetch(con)

36

Page 37: SQLite3 for Python

Выборка всех данных

В приведенном выше операторе SELECT вместо звездочки (*) были указаны

атрибуты id и name.

37

Page 38: SQLite3 for Python

SQLite3 rowcount

Счетчик строк SQLite3 используется для возврата количества строк,

которые были затронуты или выбраны последним выполненным запросом

SQL.

Когда вызывается rowcount с оператором SELECT, будет возвращено -1,

поскольку количество выбранных строк неизвестно до тех пор, пока все

они не будут выбраны. Рассмотрим пример:

print(cursorObj.execute('SELECT * FROM employees').rowcount)

38

Page 39: SQLite3 for Python

SQLite3 rowcount

Поэтому, чтобы получить количество строк, нужно получить все данные, а

затем получить длину результата:

rows = cursorObj.fetchall()

print(len(rows))

Когда оператор DELETE используется без каких-либо условий

(предложение where), все строки в таблице будут удалены, а общее

количество удаленных строк будет возвращено rowcount.

print(cursorObj.execute('DELETE FROM employees').rowcount)

Если ни одна строка не удалена, будет возвращено 0.

39

Page 40: SQLite3 for Python

Список таблиц

Чтобы вывести список всех таблиц в базе данных SQLite3, нужно

обратиться к таблице sqlite_master, а затем использовать fetchall() для

получения результатов из оператора SELECT.

Sqlite_master - это главная таблица в SQLite3, в которой хранятся все

таблицы.

40

Page 41: SQLite3 for Python

Список таблиц

import sqlite3

con = sqlite3.connect('mydatabase.db')

def sql_fetch(con):

cursorObj = con.cursor()

cursorObj.execute('SELECT name from sqlite_master where type= "table"')

print(cursorObj.fetchall())

sql_fetch(con)

41

Page 42: SQLite3 for Python

Проверка существования таблицы

При создании таблицы необходимо убедиться, что таблица еще не

существует. Аналогично, при удалении таблицы она должна существовать.

Чтобы проверить, если таблица еще не существует, используем «if not

exists» с оператором CREATE TABLE следующим образом:

42

Page 43: SQLite3 for Python

Проверка существования таблицы

import sqlite3

con = sqlite3.connect('mydatabase.db')

def sql_fetch(con):

cursorObj = con.cursor()

cursorObj.execute('create table if not exists projects(id integer, name

text)')

con.commit()

sql_fetch(con)

43

Page 44: SQLite3 for Python

Проверка существования таблицы

Точно так же, чтобы проверить, существует ли таблица при удалении, мы

используем «if not exists» с инструкцией DROP TABLE следующим образом:

cursorObj.execute('drop table if exists projects')

Также проверим, существует ли таблица, к которой нужно получить

доступ, выполнив следующий запрос:

cursorObj.execute('SELECT name from sqlite_master WHERE type = "table"

AND name = "employees"')

print(cursorObj.fetchall())

Если указанное имя таблицы не существует, будет возвращен пустой

массив.

44

Page 45: SQLite3 for Python

Удаление таблицы

Удаление таблицы выполняется с помощью оператора DROP. Синтаксис

оператора DROP выглядит следующим образом:

drop table table_name

Чтобы удалить таблицу, таблица должна существовать в БД. Поэтому

рекомендуется использовать «if exists» с оператором DROP. Например,

удалим таблицу employees:

45

Page 46: SQLite3 for Python

Удаление таблицы

import sqlite3

con = sqlite3.connect('mydatabase.db')

def sql_fetch(con):

cursorObj = con.cursor()

cursorObj.execute('DROP table if exists employees')

con.commit()

sql_fetch(con)

46

Page 47: SQLite3 for Python

Массовая вставка строк в Sqlite

Для вставки нескольких строк одновременно использовать оператор

executemany.

Рассмотрим следующий код:

47

Page 48: SQLite3 for Python

Массовая вставка строк в Sqlite

import sqlite3

con = sqlite3.connect('mydatabase.db')

cursorObj = con.cursor()

cursorObj.execute('create table if not exists projects(id integer, name text)')

data = [(1, "Ridesharing"), (2, "Water Purifying"), (3, "Forensics"), (4,

"Botany")]

cursorObj.executemany("INSERT INTO projects VALUES(?, ?)", data)

con.commit()

48

Page 49: SQLite3 for Python

Массовая вставка строк в Sqlite

Здесь создали таблицу с двумя столбцами, тогда у «данных» есть четыре

значения для каждого столбца. Эта переменная передается методу

executemany() вместе с запросом.

Обратите внимание, что использовался заполнитель для передачи

значений.

49

Page 50: SQLite3 for Python

Закрытие соединения

Когда работа с БД завершена, рекомендуется закрыть соединение.

Соединение может быть закрыто с помощью метода close ().

Чтобы закрыть соединение, используйте объект соединения с вызовом

метода close() следующим образом:

con = sqlite3.connect('mydatabase.db')

#program statements

con.close()

50

Page 51: SQLite3 for Python

SQLite3 datetime

В базе данных Python SQLite3 можно легко сохранять дату или время,

импортируя модуль datatime. Следующие форматы являются наиболее

часто используемыми форматами для даты и времени:

YYYY-MM-DD

YYYY-MM-DD HH:MM

YYYY-MM-DD HH:MM:SS

YYYY-MM-DD HH:MM:SS.SSS

HH:MM

HH:MM:SS

HH:MM:SS.SSS

51

Page 52: SQLite3 for Python

SQLite3 datetime

import sqlite3

import datetime

con = sqlite3.connect('mydatabase.db')

cursorObj = con.cursor()

cursorObj.execute('create table if not exists assignments(id integer, name

text, date date)')

data = [(1, "Ridesharing", datetime.date(2017, 1, 2)), (2, "Water Purifying",

datetime.date(2018, 3, 4))]

cursorObj.executemany("INSERT INTO assignments VALUES(?, ?, ?)", data)

con.commit()

52

Page 53: SQLite3 for Python

SQLite3 datetime

В этом коде модуль datetime импортируется первым, далее создали

таблицу с именем assignments с тремя столбцами.

Тип данных третьего столбца - дата. Чтобы вставить дату в столбец,

воспользовались datetime.date. Точно так же можно использовать

datetime.time для обработки времени.

53

Page 54: SQLite3 for Python

SQL-инъекции

54