SQLite
Подписаться на эту рубрику по RSS
Метаданные – это информация о данных в базе данных. Метаданные в SQLite содержат в себе информацию о таблицах и столбцах, в которых мы храним данные. Количество строк под воздействием оператора SQL – это метаданные. Количество строк и столбцов, возвращаемые в результирующий набор, также относятся к метаданным. Метаданные в SQLite могут быть получены с использованием команды PRAGMA. Объекты SQLite могут иметь атрибуты, которые являются метаданными. Наконец, мы также можем достать определённые метаданные от запроса таблицы sqlite_master системы SQLite.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
import sys
con = lite.connect('test.db')
with con:
cur = con.cursor()
cur.execute('PRAGMA table_info(Cars)')
data = cur.fetchall()
for d in data:
print d[0], d[1], d[2]
В этом примере, мы пускаем в обращение команду PRAGMA table_info(tableName), чтобы получить некоторую метаинформацию о нашей таблице Cars.
В этой статье, мы собираемся выполнять обратную операцию. Мы будем читать изображение из таблицы базы данных. В прошлой статье мы записали данные изображения в таблицу, теперь мы превратим эти данные обратно в изображение.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
import sys
def writeImage(data):
try:
fout = open('woman2.jpg','wb')
fout.write(data)
except IOError, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit(1)
finally:
if fout:
fout.close()
try:
con = lite.connect('test.db')
cur = con.cursor()
cur.execute("SELECT Data FROM Images LIMIT 1")
data = cur.fetchone()[0]
writeImage(data)
except lite.Error, e:
print "Error %s:" % e.args[0]
sys.exit(1)
finally:
if con:
con.close()
В этой статье, мы собираемся вставить данные изображения в базу данных SQLite. Следует отметить, что некоторые программисты выступают против помещения изображений в базы данных. Здесь мы только покажем, как делать это. Мы не станем останавливаться на технических проблемах того, сохранять ли изображения в базах данных или нет. Это применяется в зависимости от ситуации, когда эффективнее сохранять в базе чем в файлах.
sqlite> CREATE TABLE Images(Id INTEGER PRIMARY KEY, Data BLOB);
Для этого примера, мы создаём новую таблицу, называемую Images. Для изображений мы используем тип данных BLOB, который расшифровывается как Binary Large Objects.
Сейчас мы научимся работать с параметрами при создании запроса. Когда мы используем параметризованные запросы, мы используем местозаполнители вместо прямого написания значений в SQL запросе. Запросы с указанием параметров отдельно увеличивают безопасность и производительность.
Python модуль sqlite3 поддерживает два типа заполнителей: знаки вопроса и именованные заполнители.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
import sys
uId = 1
uPrice = 62300
con = lite.connect('test.db')
with con:
cur = con.cursor()
cur.execute("UPDATE Cars SET Price=? WHERE Id=?", (uPrice, uId))
con.commit()
print "Number of rows updated: %d" % cur.rowcount
Мы обновляем цену одной машины. В этом примере кода, мы используем заполнители типа «знак вопроса».
В предыдущей статьи [часть 2] мы рассмотрели моменты создания таблицы в базу данных и внесения данных в эту таблицу. В данной статье покажем пример как получить данные из таблицы.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
import sys
con = lite.connect('test.db')
with con:
cur = con.cursor()
cur.execute("SELECT * FROM Cars")
rows = cur.fetchall()
for row in rows:
print row
В этом примере, мы извлекаем все данные из таблицы Cars.
Мы создадим таблицу Cars и внесем несколько строк данных в неё.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
import sys
# Подключаемся к базе данных
con = lite.connect('test.db')
with con:
cur = con.cursor()
# Создаем таблицу
cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT)")
# Вносим данные
cur.execute("INSERT INTO Cars VALUES(1, 'Audi', 52642)")
cur.execute("INSERT INTO Cars VALUES(2, 'Mercedes', 57127)")
cur.execute("INSERT INTO Cars VALUES(3, 'Skoda', 9000)")
cur.execute("INSERT INTO Cars VALUES(4, 'Volvo', 29000)")
cur.execute("INSERT INTO Cars VALUES(5, 'Bentley', 350000)")
cur.execute("INSERT INTO Cars VALUES(6, 'Citroen', 21000)")
cur.execute("INSERT INTO Cars VALUES(7, 'Hummer', 41400)")
cur.execute("INSERT INTO Cars VALUES(8, 'Volkswagen', 21600)")
Данный скрипт создаёт таблицу Cars и вставляет 8 строк в таблицу.
cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT)")
Этот SQL-запрос создает новую таблицу Cars. Таблица имеет три столбца.
cur.execute("INSERT INTO Cars VALUES(1,'Audi',52642)")
cur.execute("INSERT INTO Cars VALUES(2,'Mercedes',57127)")
Это руководство по программированию в Python используя базы данных SQLite. Оно покрывает основы программирования SQLite с помощью языка Python.
Необходимые условия
Чтобы работать с примерами их статьи, мы должны иметь установленный в системе язык Python, базу данных SQLite, привязку к языку pysqlite и инструмент командной строки sqlite3. Если мы имеем Python 2.5+, тогда нам необходимо только установить инструмент командной строки sqlite3. Как библиотека SQLite, так и привязка к языку pysqlite встроены в язык Python.
$ python
Python 2.7.3 (default, Jan 2 2013, 16:53:07)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.version
'2.6.0'
>>> sqlite3.sqlite_version
'3.7.13'
Согласно спецификации DB-API 2.0 после создания объекта соединения необходимо создать объект-курсор. Все дальнейшие запросы должны производиться через этот объект. Создание объекта-курсора производится с помощью метода cursor(). Для выполнения запроса к базе данных предназначены следующие методы объекта-курсора:
close() - закрывает объект-курсор
executescript(<Запросы SQL через точку с запятой>) - выполняет несколько SQL запросов за один раз. Если в процессе выполнения запросов возникает ошибка, то метод возбуждается исключение. В качестве примера создадим базу данных и три таблицы в ней:
# -*- coding: utf-8 -*-
import sqlite3
con = sqlite3.connect("catalog.db")
cur = con.cursor() # Создаем объект-курсор
sql = """\
CREATE TABLE user (
id_user INTEGER PRIMARY KEY AUTOINCREMENT,
email text,
passw text
);
CREATE TABLE rubr (
id_rubr INTEGER PRIMARY KEY AUTOINCREMENT,
name_rubr TEXT
);
CREATE TABLE site (
id_site INTEGER PRIMARY KEY AUTOINCREMENT,
is_user INTEGER,
id_rubr INTEGER,
url TEXT,
title TEXT,
iq INTEGER
);
"""
try: # обработка исключения
cur.executescript(sql) # Выполняем SQL-запрос
except sqlite.DatabaseError, err:
print u"Ошибка:", err
else:
print u"Запрос успешно выполнен"
cur.close() # Закрываем объект-курсора
con.close() # Закрываем соединение
raw_input()
Далее...
Для создания и открытия базы данных используется функция connect(). Функция имеет следующий формат:
connect(database[, timeout][, isolation_level][, detect_types][, factory])
В параметре database указывается абсолютный или относительный путь к базе данных. Если база данных не существует, то она просто открывается без удаления имеющихся данных. Вместо пути к базе данных можно указать значение :memory:, которое означает, что база данных будут удалены.
Все остальные параметры являются необязательными и могут быть указаны в произвольном порядке путем присвоения значения названию параметра. Необязательный параметр timeout задает время ожидания снятия блокировки с открываемой базы данных. По умолчанию значение параметра timeout равно пяти секундам. Предназначение остальных параметров мы рассмотрим немного позже.
В предыдущих статьях мы рассматривали работу с файлами и научились сохранять объекты с доступом по ключу с помощью модуля shelve. При сохранении объектов этот модуль использует возможности модуля pickle для сериализации объекта и модуль anybm для записи получившейся строки по ключу в файл. Если необходимо сохранять в файл просто строки, то можно сразу воспользоваться модулем anybm. Однако если объем сохраняемых данных велик и требуется удобный доступ к ним, то вместо этого модуля лучше использовать базы данных.
Начиная с версии 2.5, в состав стандартной библиотеки Python входит модуль sqlite3, позволяющий работать с базой данных SQLite. Для использования этой базы данных нет необходимости устанавливать сервер, ожидающий запросы на каком-либо порту, т.к. SQLite напрямую работает с файлом базы данных.