Программный интерфейс приложения (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, часто имея некоторые расширения или разницу в деталях.

<p>SQLite</p>

SQLite (http://www.sqlite.org/) — это хорошая легковесная реляционная база данных с открытым исходным кодом. Она реализована как стандартная библиотека Python и хранит базы данных в обычных файлах. Эти файлы можно переносить на другие машины и в операционные системы, что делает SQLite очень портативным решением для создания простых реляционных баз данных. У нее не так много возможностей, как у MySQL или PostgreSQL, но она поддерживает SQL и позволяет нескольким пользователям работать с ней одновременно. Браузеры, смартфоны и другие операционные системы используют SQLite как встроенную базу данных.

Работа с базой данных начинается с вызова connect() для установки соединения с локальным файлом базы данных, который вы хотите создать или использовать. Этот файл эквивалентен похожей на каталог базе данных, которая хранит таблицы на других серверах. С помощью специальной строки ':memory:' можно создать базу данных только в памяти — это быстро и полезно для тестирования, но данные будут потеряны при завершении программы или выключении компьютера.

Для следующего примера создадим базу данных 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(). Заполнители помогают нам справляться с нудными деталями вроде расстановки кавычек. Они защищают от SQL-инъекций — внешней атаки, распространенной в Сети, которая внедряет в систему вредные команды SQL.

Теперь проверим, сможем ли мы получить назад список наших животных:

>>> 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')

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Похожие книги