Программный интерфейс приложения (Application Programming Interface, API) — это набор функций, которые вы можете вызвать, чтобы получить доступ к какой-либо услуге. DB-API (http://bit.ly/db-api) — это стандартный API в Python, предназначенный для получения доступа к реляционным базам данных. С его помощью вы можете написать одну программу, которая работает с несколькими видами реляционных баз данных, вместо того чтобы писать несколько программ для работы с каждым видом баз данных по отдельности. Этот API похож на JDBC в Java или dbi в Perl.
Рассмотрим его основные функции.
• connect() — создание соединения с базой данных. Этот вызов может включать в себя аргументы вроде имени пользователя, пароля, адреса сервера и пр.
• cursor() — создание объекта
• execute() и executemany() — запуск одной или более команд SQL.
• fetchone(), fetchmany() и fetchall() — получение результатов работы функции execute.
Модули работы с базами данных в Python, которые будут рассмотрены в следующих разделах, соответствуют DB-API, часто имея некоторые расширения или разницу в деталях.
SQLite
SQLite (http://www.sqlite.org/) — это хорошая легковесная реляционная база данных с открытым исходным кодом. Она реализована как стандартная библиотека Python и хранит базы данных в обычных файлах. Эти файлы можно переносить на другие машины и в операционные системы, что делает SQLite очень портативным решением для создания простых реляционных баз данных. У нее не так много возможностей, как у MySQL или PostgreSQL, но она поддерживает SQL и позволяет нескольким пользователям работать с ней одновременно. Браузеры, смартфоны и другие операционные системы используют SQLite как встроенную базу данных.
Работа с базой данных начинается с вызова connect() для установки соединения с локальным файлом базы данных, который вы хотите создать или использовать. Этот файл эквивалентен похожей на каталог
Для следующего примера создадим базу данных enterprise.db и таблицу zoo, чтобы управлять нашим увлекательным бизнесом по содержанию придорожного контактного зоопарка. В таблице будут содержаться следующие графы:
• critter — строка переменной длины, наш первичный ключ;
• count — целочисленное количество единиц используемого инвентаря для этого животного;
• damages — количество долларов, потерянных из-за взаимодействий людей с животными:
>>> import sqlite3
>>> conn = sqlite3.connect('enterprise.db')
>>> curs = conn.cursor()
>>> curs.execute('''CREATE TABLE zoo
····(critter VARCHAR(20) PRIMARY KEY,
·····count INT,
·····damages FLOAT)''')
Тройные кавычки в Python очень полезны при создании длинных строк вроде запросов SQL.
Теперь добавим в зоопарк несколько животных:
>>> curs.execute('INSERT INTO zoo VALUES("duck", 5, 0.0)')
>>> curs.execute('INSERT INTO zoo VALUES("bear", 2, 1000.0)')
Существует более безопасный способ добавить данные — использовать заполнитель:
>>> ins = 'INSERT INTO zoo (critter, count, damages) VALUES(???)'
>>> curs.execute(ins, ('weasel', 1, 2000.0))
В этот раз мы использовали в запросе три вопросительных знака, чтобы показать, что планируем добавить три значения, а затем добавить эти значения списком в функции execute(). Заполнители помогают нам справляться с нудными деталями вроде расстановки кавычек. Они защищают от
Теперь проверим, сможем ли мы получить назад список наших животных:
>>> curs.execute('SELECT * FROM zoo')
>>> rows = curs.fetchall()
>>> print(rows)
[('duck', 5, 0.0), ('bear', 2, 1000.0), ('weasel', 1, 2000.0)]
Получим их снова, но на этот раз упорядочим список по количеству животных:
>>> curs.execute('SELECT * from zoo ORDER BY count')
>>> curs.fetchall()
[('weasel', 1, 2000.0), ('bear', 2, 1000.0), ('duck', 5, 0.0)]
Эй, мы хотели получить список в нисходящем порядке:
>>> curs.execute('SELECT * from zoo ORDER BY count DESC')