Простой Python. Современный стиль программирования (Любанович) - страница 134

Работа с базой данных начинается с вызова 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)]