count INT,
damages FLOAT)''')
<sqlite3.Cursor object at 0x1006a22d0>
Тройные кавычки в Python очень полезны при создании длинных строк вроде
запросов SQL.
Теперь добавим в зоопарк несколько животных:
>>> curs.execute('INSERT INTO zoo VALUES("duck", 5, 0.0)')
<sqlite3.Cursor object at 0x1006a22d0>
>>> curs.execute('INSERT INTO zoo VALUES("bear", 2, 1000.0)')
<sqlite3.Cursor object at 0x1006a22d0>
Существует более безопасный способ добавить данные — использовать запол-
нитель:
>>> ins = 'INSERT INTO zoo (critter, count, damages) VALUES(?, ?, ?)'
>>> curs.execute(ins, ('weasel', 1, 2000.0))
<sqlite3.Cursor object at 0x1006a22d0>
236
Глава 8. Данные должны куда-то попадать
В этот раз мы использовали в запросе три вопросительных знака, чтобы показать,
что планируем добавить три значения, а затем добавить эти значения списком
в функции execute(). Заполнители помогают нам справляться с нудными деталями
вроде расстановки кавычек. Они защищают от SQL-инъекций — внешней атаки,
распространенной в Сети, которая внедряет в систему вредные команды SQL.
Теперь проверим, сможем ли мы получить назад список наших животных:
>>> curs.execute('SELECT * FROM zoo')
<sqlite3.Cursor object at 0x1006a22d0>
>>> 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')
<sqlite3.Cursor object at 0x1006a22d0>
>>> curs.fetchall()
[('weasel', 1, 2000.0), ('bear', 2, 1000.0), ('duck', 5, 0.0)]
Эй, мы хотели получить список в нисходящем порядке:
>>> curs.execute('SELECT * from zoo ORDER BY count DESC')
<sqlite3.Cursor object at 0x1006a22d0>
>>> curs.fetchall()
[('duck', 5, 0.0), ('bear', 2, 1000.0), ('weasel', 1, 2000.0)]
Какие животные обходятся нам дороже всего?
>>> curs.execute('''SELECT * FROM zoo WHERE
... damages = (SELECT MAX(damages) FROM zoo)''')
<sqlite3.Cursor object at 0x1006a22d0>
>>> curs.fetchall()
[('weasel', 1, 2000.0)]
Вы могли бы подумать, что это медведи. Лучше всегда проверять актуальные
данные.
Перед тем как оставить в покое SQLite, нам нужно прибраться. Если мы от-
крывали соединение и курсор, нужно закрыть их после того, как работа будет закон-
чена: