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