После загрузки данных нам может потребоваться вывести их. Сценарий в примере 17.10 позволяет отображать результаты по мере их получения — он выводит таблицу целиком в простом виде (ее можно анализировать с помощью дополнительных инструментов) или форматированном (с помощью утилиты создания словарей записей, написанной нами ранее). Обратите внимание, что здесь вычисляется максимальный размер имен полей, чтобы реализовать выравнивание в выражении-генераторе; ширина поля вывода в выражении форматирования строки определяется символом звездочки (*).
Пример 17.10. PP4E\Dbase\Sql\dumpdb.py
отображает содержимое таблицы в виде простых кортежей или в форматированном виде с именами полей порядок использования из командной строки:
dumpdb.py dbname? table? [-] (dash=formatted display)
def showformat(recs, sept=(‘-‘ * 40)): print(len(recs), ‘records’)
print(sept)
for rec in recs:
maxkey = max(len(key) for key in rec) # макс. длина ключа
for key in rec: # или: \t
print(‘%-*s => %s’ % (maxkey, key, rec[key])) # -ljust, *длина print(sept)
def dumpdb(cursor, table, format=True):
if not format:
cursor.execute(‘select * from ‘ + table) while True:
rec = cursor.fetchone() if not rec: break print(rec)
else:
from makedicts import makedicts
recs = makedicts(cursor, ‘select * from ‘ + table) showformat(recs)
if __name__ == ‘__main__’:
import sys
dbname, format, table = ‘dbase1’, False, ‘people’
cmdargs = sys.argv[1:]
if ‘-‘ in cmdargs: # форматировать, если ‘-‘ в арг. ком. строки
format = True # имя БД в другом аргументе ком. строки
cmdargs.remove(‘-‘)
if cmdargs: dbname = cmdargs.pop(0)
if cmdargs: table = cmdargs[0]
from loaddb import login
conn, curs = login(dbname)
dumpdb(curs, table, format)
Раз уж мы заговорили об этом, напишем еще несколько вспомогательных сценариев для инициализации и очистки базы данных, чтобы нам не приходилось всякий раз вводить одни и те же строки в интерактивной оболочке, когда нам потребуется начать все сначала. Сценарий в примере 17.11 полностью удаляет и воссоздает заново содержимое базы данных, чтобы вернуть ее в начальное состояние (мы вручную выполняли эту операцию в начале учебника).
Пример 17.11. PP4E\Dbase\Sql\makedb.py
физически удаляет и воссоздает файлы базы данных порядок использования: makedb.py dbname? tablename?
import sys
if input(‘Are you sure?’).lower() not in (‘y’, ‘yes’) sys.exit()
dbname = (len(sys.argv) > 1 and sys.argv[1]) or ‘dbase1’ table = (len(sys.argv) > 2 and sys.argv[2]) or ‘people’
from loaddb import login conn, curs = login(dbname) try:
curs.execute(‘drop table ‘ + table)
except:
print(‘database table did not exist’)
command = ‘create table %s (name char(30), job char(10), pay int(4))’ % table curs.execute(command)
conn.commit() # подтверждение здесь может быть необязательным
print(‘made‘, dbname, table)
Следующий сценарий, представленный в примере 17.12, очищает базу данных, удаляя все строки в таблице, вместо полного удаления таблицы и повторного ее создания. Для тестирования можно использовать любой из подходов. Небольшое предупреждение: атрибут rowcount в SQLite не всегда отражает количество удаленных строк — подробности смотрите в руководстве по библиотеке.
Пример 17.12. PP4E\Dbase\Sql\cleardb.py
удаляет все строки в таблице, но не удаляет таблицу в базе данных порядок использования: cleardb.py dbname? tablename?
import sys
if input(‘Are you sure?’).lower() not in (‘y’, ‘yes’) sys.exit()
dbname = sys.argv[1] if len(sys.argv) > 1 else ‘dbase1’ table = sys.argv[2] if len(sys.argv) > 2 else ‘people’
from loaddb import login
conn, curs = login(dbname)
curs.execute(‘delete from ‘ + table)
#print(curs.rowcount, ‘records deleted’) # соед. будет закрыто
# методом __del__
# иначе строки не будут удалены
Наконец, в примере 17.13 представлен инструмент командной строки, который выполняет запрос и выводит таблицу с результатами в форматированном виде. Это довольно короткий сценарий, потому что большую часть его задач мы уже автоматизировали. В значительной мере он просто объединяет существующие инструменты. Такова мощь повторного использования программного кода в Python.
Пример 17.13. PP4E\Dbase\Sql\querydb.py
выполняет строку запроса, выводит результаты в форматированном виде пример: querydb.py dbase1 "select name, job from people where pay > 50000" import sys
database, querystr = ‘dbase1’, ‘select * from people’
if len(sys.argv) > 1: database = sys.argv[1]
if len(sys.argv) > 2: querystr = sys.argv[2]
from makedicts import makedicts from dumpdb import showformat from loaddb import login
conn, curs = login(database) rows = makedicts(curs, querystr) showformat(rows)
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011