Модуль, позволяющий работать с базой данных SQLite3
Согласно спецификации DB-API 2.0 последовательность работы с базой данных выглядит следующим образом:
Производится подключение к базе данных с помощью функции connect()
.
Функция возвращает объект соединения, с помощью которого осуществляется дальнейшая работа с базой данных.
Создается объект-курсор.
Выполняются SQL-запросы и обрабатываются результаты.
Перед выполнением первого запроса, который изменяет записи (INSERT, REPLACE, UPDATE и DELETE), автоматически запускается транзакция.
Завершается транзакция или отменяются все изменения в рамках транзакции.
Закрывается объект-курсор.
Закрывается соединение с базой данных.
sqlite3.
apilevel
Возвращает строку, номер спецификации DB-API
sqlite3.apilevel
# '2.0'
sqlite3.
sqlite_version
Возвращает строку, номер версии моудля
sqlite3.sqlite_version
# '3.7.4'
sqlite3.
sqlite_version_info
Возвращает кортеж, номер версии модуля
sqlite3.sqlite_version_info
# (3, 7, 4)
sqlite3.
complete_statement
(sql)Возвращает булево, завершенности запроса
sqlite3.complete_statement('SELECT 10 > 5;')
# True
sqlite3.
connect
(database[, timeout=5] [, lsolatlon_level] [, detect_types] [, factory] [, check_same_thread] [, cached_statements])Возвращает Connection
для работы с БД
database - строка, путь к БД, если БД не существует она автоматический создастся.
Также можно указать значение :memory:, которая означает что БД создается в памяти.
timeout - время ожидания снятия блокировки с открываемой БД, в секундах
conn = sqlite3.connect("db.db")
sqlite3.
register_adapter
(<тип данных или класс>, <ссылка на функцию>)Регистрирует пользовательскую функцию, которая будети вызываться при попытке вставки объекта в запросе.
class Car(object):
def __init__(self, model, color):
self.model, self.color = model, color
def my_adapter(car):
return '{0}|{1}'.format(car.model, car.color)
sqlite3.register_adapter(Car, my_adapter)
car = Car('car1', 'red')
cur.execute('INSERT INTO cars VALUES (?)', (car, ))
Вместо регистрации функции преобразования типа можно внутри класса определить метод __conform__(self, <Протокол>), где протокол соответсввует PrepareProtokol.
class Car(object):
def __init__(self, model, color):
self.model, self.color = model, color
def __conform__(self, protokol):
if protokol is sqlite3.PrepareProtokol:
return '{0}|{1}'.format(car.model, car.color)
sqlite3.
register_converter
(<тип данных>, <ссылка на функцию>)Регистрирует пользовательскую функцию преобразования типа данных
Чтобы интерпретатор смог определить,
какую функцию необходимо вызвать для преобразования типа данных,
следует явно указать местоположение метки с помощью параметра detect_types
функции connect()
.
Параметр может принимать следующие значения (или их комбинацию через |):
sqlite3.PARSE_COLNAMES - тип данных указывается в запросе в псевдониме поля внутри квадратных скобок
SELECT model as "c [mycar]" FROM mycarssqlite3.PARSE_DECLTYPES - тип данных определяется по значению, указанному после названия поля в инструкции CREATE TABLE.
CREATE TABLE cars (model mycar)
class Car(object):
def __init__(self, model, color):
self.model, self.color = model, color
def __repr__(self):
return '{0} {1}'.format(self.model, self.color)
def myconverter(value):
value = str(value, 'utf-8')
model, color = value.split('|')
return Car(model, color)
sqlite3.register_converter('mycar', myconverter)
cur.execute('SELECT model as "c [mycar]" FROM cars')
sqlite3.
Connection
объект для работы с БД
close
()закрывает соединение с БД
conn.close()
commit
()завершает текущую транзакцию
create_aggregation
(<название функции>, <количесвто параметров>, <ссылка на класс>)связывает название функции в SQL-запросе с пользовательской функцией.
Класс должен иметь два метода:
step() - сюда передаются параметры
finalize() - возвращает результат
class MyClass:
def __init__(self) :
self.result = []
def step(self, value):
self.result.append(value)
def finalize(self):
self.result.sort()
return " - ".join(self.result)
con.create_aggregate("myfunc", 1, MyClass)
cur.execute ( "SELECT myfunc(nаme) FROM table")
create_collation
(<название функции сортировки>, <ссылка на функцию сортировки>)связывает название функции в SQL-запросе с пользовательской функцией.
Функция сортировки принимает две строки и должна возвращать:
1 - если первая больше второй
-1 - если вторая больше первой
0 - если они равны.
def myfunc (s1, s2):
s1 = s1.lower()
s2 = s2 .lower ()
if s1 == s2:
return 0
elif s1 > s2:
return 1
else:
return -1
con.create_collation("myfunc", myfunc)
cur = con.cursor()
cur.execute("SELECT * FROM words ORDER ВУ word COLLATE myfunc")
create_function
(<название функции>, <количество параметров>, <ссылка на функцию>)связывает название функции в SQL-запросе с пользовательской функцией.
Функция сортировки принимает две строки и должна возвращать:
1 - если первая больше второй
-1 - если вторая больше первой
0 - если они равны.
def myfunc(s):
return s .1ower ()
con.create_function("mylower", 1, myfunc)
cur = con.cursor()
cur.execute("SELECT * FROM words WHERE mylower(name) like 'ilnurgi'")
cursor
()возвращает объект Cursor
для выполнения запросов
curs = conn.cursor()
rollback
()откатывает изменения в текущей транзакции
sqlite3.
Cursor
объект для выполнения запросов
close
()закрывает курсор
curs.close()
execute
(sql[, <значения>])выполянет один запрос
cur.execute(
'insert into table (name) values (?)',
('ilnurgi', ))
cur.execute(
'insert into table values (?, ?)',
(2, 'ilnurgi'))
cur.execute(
'insert into table values (:id, :name)',
{'id': 2, 'name': ilnurgi'})
executemany
(sql, args)выполняет запрос для нескольких значений
cur.execute(
'insert into table values (?, ?)',
[(1, 'ilnurgi'), (2, 'ilnurgi')])
exequtescript
(sql)выполняет несколько запросов за один раз
fetchall
()возвращает список кортежей всех записей запроса
rows = curs.fetchall()
# [(1, ), (2, )]
fetchmany
([size=cursor.arraysize])возвращает список кортежей записей запроса
cur.fetchmany(3)
# [(1, 'name1'), (2, 'name2'), (3, 'name3')]
fetchone
()возвращает одну запись из результата запроса в виде кортежа.
Если записей больше нет, вернет None.
__next__
()возвращает одну запись из результата запроса в виде кортежа.
Если записей больше нет, возбуждает исключение StopIteration.
description
возвращает кортеж кортежей с именами полей в результате выполнения инструкции SELECT.
lastrowid
возвращает индекс последней добавленной записи с помощью инструкции INSERT и метода exequte().
Если индекс не определен то вернет None.
rowcount
возвращает количество измененных или удаленных записей.
Если количество не определено, возвращает -1.
Exception -
Warning - важные предупреждения
Error - базовый класс для всех ошибок
InterfaceError - ошибки с интерфейсом
DatabaseError - базовый класс для ошибок БД
DataError - ошибка при обработке данных
OperationError - ошибка связана с опрецией в БД
IntegrityError - ошибка с внешними ключами или индексом
InternalError - внутренняя ошибка БД
ProgrammingError - ошибка программирования
NotSupportedError - ошибка при использовании методов, не поддерживаемых БД
# список всех таблиц базы
cursor.execute('select name from sqlite_master where type="table"')