Автоматизация операций с помощью сценариев и модулей

avtomatizaciya operacij s pomoshhju scenariev i modulej Базы данных и постоянное хранение

До настоящего момента мы использовали Python как своеобразный клиент SQL командной строки — мы вводили и выполняли запросы в интерактивном режиме. Однако программный код, который мы запускали выше, можно использовать в качестве основы реализации операций с базами данных в сценариях. При работе в интерактивной оболочке требуется заново вводить такие конструкции, как многострочные циклы, что может быть весьма утомительным занятием. С помощью сценариев мы можем автоматизировать нашу работу.

Для демонстрации возьмем последний пример из предыдущего раздела и создадим вспомогательный модуль — в примере 17.4 приводится реализация модуля многократного использования, который знает, как преобразовывать результаты запросов из кортежей с записями в словари.

Пример 17.4. PP4E\Dbase\Sql\makedicts.py

преобразует список кортежей записей в список словарей,

роль ключей в которых играют имена полей

это не утилита командной строки: при запуске из командной строки выполняется жестко определенный программный код самотестирования

def makedicts(cursor, query, params=()): cursor.execute(query, params)

colnames = [desc[0] for desc in cursor.description]

rowdicts = [dict(zip(colnames, row)) for row in cursor.fetchall()] return rowdicts

if __name__ == ‘__main__’: # самотестирование

import sqlite3

conn = sqlite3.connect(‘dbase1’)

cursor = conn.cursor()

query = ‘select name, pay from people where pay < ?’

lowpay = makedicts(cursor, query, [70000]) for rec in lowpay: print(rec)

Как обычно, этот файл можно запустить из командной строки как самостоятельный сценарий, чтобы выполнить программный код самотестирования:

\PP4E\Dbase\Sql> makedicts.py

{‘pay’: 65000, ‘name’: ‘Ann’}

{‘pay‘: 65000, name‘: ‘Kim‘}

Также можно импортировать его как модуль и вызывать его функции из другого контекста, например из интерактивного сеанса. Поскольку это модуль, он превратился в инструмент баз данных многократного использования:

\PP4E\Dbase\Sql> python

>   >> from makedicts import makedicts

>   >> from sqlite3 import connect

>   >> conn = connect(‘dbase1’)

>>> curs = conn.cursor()

>>> curs.execute(‘select * from people’)

>>> curs.fetchall()

[(‘Sue’, ‘mus’, 70000), (‘Ann’, ‘mus’, 65000), (‘Kim’, ‘adm’, 65000)]

>>> rows = makedicts(curs, "select name from people where job = ‘mus’")

>>> rows

[{‘name’: ‘Sue’}, {‘name’: ‘Ann’}]

Наша утилита способна обрабатывать запросы произвольной сложности — они просто передаются модулю связи с сервером баз данных или библиотекой. Предложение order by в следующем примере выполняет сортировку результатов по полю name:

>>> query = ‘select name, pay from people where job = ? order by name’

>>> musicians = makedicts(curs, query, [‘mus’])

>>> for row in musicians: print(row)

{‘pay’: 65000, ‘name’: ‘Ann’}

{‘pay’: 70000, ‘name’: ‘Sue’}

Объединяем все вместе

Теперь мы знаем, как создавать базы данных и таблицы, как вставлять записи в таблицы, как запрашивать содержимое таблиц и как извлекать имена столбцов. Для справки и для демонстрации того, как можно комбинировать эти приемы, в примере 17.5 они объединены в один сценарий.

Пример 17.5. PP4E\Dbase\Sql\testdb.py

from sqlite3 import connect

conn = connect(‘dbase1’)

curs = conn.cursor()

try:

curs.execute(‘drop table people’)

except:

pass # не существует

curs.execute(‘create table people (name char(30), job char(10), pay int(4))’)

curs.execute(‘insert into people values (?, ?, ?)’, (‘Bob’, ‘dev’, 50000)) curs.execute(‘insert into people values (?, ?, ?)’, (‘Sue’, ‘dev’, 60000))

curs.execute(‘select * from people’) for row in curs.fetchall():

print(row)

curs.execute(‘select * from people’)

colnames = [desc[0] for desc in curs.description] while True:

print(‘-‘ * 30) row = curs.fetchone() if not row: break for (name, value) in zip(colnames, row): print(‘%s => %s’ % (name, value))

conn.commit() # сохранить вставленные записи

Если что-то в этом сценарии вам покажется непонятным, обращайтесь за разъяснениями к предыдущим разделам в этом учебнике. При запуске он создает базу данных с двумя записями и выводит ее содержимое в стандартный поток вывода:

C:\\PP4E\Dbase\Sql> testdb.py (‘Bob’, ‘dev’, 50000)

(‘Sue’, ‘dev’, 60000) name => Bob job => dev pay => 50000 name => Sue job => dev pay => 60000

Данный пример предназначен лишь для демонстрации интерфейса баз данных. В нем жестко определены имена в базе данных, и при каждом запуске он заново создает базу данных. Мы можем превратить этот программный код в более универсальные инструменты, организовав его в виде компонентов многократного использования, как будет показано далее в этом разделе. Но сначала рассмотрим приемы загрузки данных в наши базы данных.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий