Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 181

(critter VARCHAR(20) PRIMARY KEY,

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, нам нужно прибраться. Если мы от-

крывали соединение и курсор, нужно закрыть их после того, как работа будет закон-

чена: