Саммерфилд - Программирование на Python 3 (1077331), страница 114
Текст из файла (страница 114)
Базы данных ОВМ Модуль зпе1че представляет собой обертку вокруг 1)ВМ, ТИП ДИННЫХ позволяя нам взаимодействовать с базой данных 1)ВМ, как с обычным словарем, в котором в качестве ключей ств 344 допускается использовать только строки, а в качестве значений — объекты, допускающие возможность консер- вирования. За кулисами модуль зае1не преобразует клю- чи и значения в объекты типа сугез и обратно.
Поскольку модуль зае1не основан на использовании лучшей из доступных баз данных 1)ВМ, есть вероятность, что файл РВМ„сохраненный на одной машине, не будет читаться на другой, если на другой машине отсутствует поддержка той же самой ВВМ. Наиболее типичное решение такой проблемы состоит в том, чтобы обеспечить возможность импорта и экспорта данных в формате ХМЬ для файлов, которые должны быть переносимыми с машины на машину. Именно это мы и реализуем в программе х(ох(з-х(Ьт.ру в этом разделе.
В качестве ключей мы будем использовать названия фильмов на дисках 1)ЧВ, а в качестве значений — кортежи, в которых будут храниться имя режиссера, год и продолжительность фильма. Благодаря модулю ззе1ие нам не придется выполнять каких-либо преобразований данных, и мы можем воспринимать объект ПВМ как обычный словарь. Так как по своей структуре программа похожа на интерактивные программы, управляемые с помощью меню, которые мы уже видели ранее, мы сосредоточимся исключительно на аспектах, связанных с программированием 1)ВМ. Ниже приводится фрагмент из функции аазп(), где был опущен программный код, выполняющий обработку меню: 510 Глааа11. Программироаание приложений базданных бЬ = Нопе Тгу; дЬ = зпе1уе.ореп(ГТ1епаве, ргососо1=р!ЬХ1е.Н16НЕОТ РНОТОСОЕ) Гспа11у: Ы бо Тз поС попе: бо.о1озе() Здесь открывается (или создается, если он еще не существует) указанный файл ])ВМ в режиме для чтения и для записи.
Значение каждого элемента сохраняется в файле в виде объекта, законсервированного с использованием указанного протокола консервирования. Существующие элементы можно будет прочитать, даже если они были сохранены с использованием меньшего номера протокола, поскольку интерпретатор в состоянии определять правильный номер протокола при чтении законсервированных объектов.
В конце функции файл ПВМ закрывается, в результате происходит очистка внутреннего кеша ]ОВМ, производится запись всех изменений на диск и собственно закрытие файла. Программа предоставляет возможность добавлять, редактировать, просматривать, импортировать и экспортировать данные. Мы пропустим процедуры импортирования и экспортирования данных в формате ХМ!, поскольку они очень похожи на те, что мы рассматривали в главе 7.
Точно так же мы опустим большую часть программного кода реализации пользовательского интерфейса, кроме операции добавления, потому что мы видели его прежде в других контекстах. бес абб буб(бЬ): т!Т1е = Сопзо1е.деС згг!пд("Г!С1е", "СТС1е") !Г поС С111е: гесигп б!геосог = Сопзо1е.дет зсг1пд("О!геосог", "бсгеосог") ТГ поС бсгеоСог: ге!иго уеаг = Сопзо1е.дес 1пСедег("уеаг", "уеаг", в!псвив=1896, вахсвив=батес1ве.бате.собау().уеаг) сига!!оп = Сопзо1е.дес !пседег("Сига!!оп (в!пи!ее]", "всписез", всп1вив=д, вахьвив=60*48) дЬ[С111е] = (бсгео(ог, уеаг, бога!Топ) бо.пупс() Этой функции, как и любой другой, вызываемой из меню программы, передается в качестве единственного параметра объект ])ВМ (бЬ). Большая часть функции связана с получением данных о диске 11ЧТ) и только в последней строке производится сохранение элемента ключ- значение в файле ])ВМ, где в качестве ключа используется название фильма, а в качестве значения — кортеж с именем режиссера, годом выпуска и продолжительностью (который консервируется средствами модуля зле1уе).
511 Базы данным ()ВМ Для сохранения непротиворечивости, свойственной языку РуФ]топ, механизмы ВВМ предоставляют тот же самый АР], что и словари, поэтому нам не придется осваивать новый синтаксис помимо функции зое1че, ореп(), которую мы уже видели выше, и метода взе1че. 80е!Т. зупс(), который используется для очистки внутреннего каша модуля зае1че и синхронизации данных, находящихся в дисковом файле с последними изменениями, — в данном случае просто добавляется новый элемент.
бЕГ Еб!! бчб(бЬ): 01б !х!1е = Тапб бчб(бЬ, "еб1!") !Т о1б !1!1е 1в Мопе. ге!Ьгп !!!1е = Сопзо1е.де! в!гапд("Т1!1е", "!а!1е", о1б !1!1е) !Г по! !!!1е: ге!Ьгп б!гео!ог, уеаг, бога!хоп = бЬ[о1б !1!1е] бЬ[!х!1е] = (багесСог, уеаг, бога!1оп) 1( !1!1е ) = оы !!!1е; бе1 бЬ[01б !1!1е] бЬ.вупо() Чтобы отредактировать сведения о диске, пользователь должен сначала выбрать диск, с которым он будет работать. Для этой операции требуется получить только название, так как названия служат ключами, а значения хранят остальные данные. Необходимая для этого функциональность будет востребована и в других местах (например, при удалении ]:)ЧЭ), поэтому мы вынесли ее в отдельную функцию (1пб бчб(), которую мы рассмотрим следующей.
Если диск найден, мы получаем от пользователя изменения, используя существующие значения как значения по умолчанию, чтобы повысить скорость взаимодействия. (Мы опустили большую часть программного кода, выполняющего взаимодействие с пользователем, так как в большинстве своем он остался тем же, что используется в функции добавления нового диска.) В конце мы сохраняем данные точно так же, как и в функции добавления.
Если название не изменялось, эта операция будет иметь эффект перезаписи значения, ассоциированного с ключом, но если название изменилось, будет создана новая пара ключ-значение, и в этом случае необходимо удалить оригинальный элемент. бе( г1пб бчб(б0, аевваде): аевваде = "(3!аг! оГ) !!!1е го " + еевваде чп|1е Тгое: аа!спев = [] в!аг! = Сопво1е.де! в!г!пд(аевваде, "!1!1е") !Т по! в!агг: ге!чгп Мопе Тог С1!1е 1п бо: а! !х!1е. 1очег().в!аг!вча!Ь(в!аг!.
1очег()). 512 Глава 11. Программирование приложений баз данных Ма!свез. аррепб(с111е ) с( 1еп(Ма!слез) == 0: ргспс("тьеге аге по буба зсагс1пц н!сь", зсагс) сопс!пое е11( 1еп(засопев] == 1: гесогп Ма!слез[0] е)!Г 1еп(Ма!слез) > 013РСАУ (1М1Т; рппс("тоо валу буба зсагс и!сь (О); сгу епсеппц " "аоге ог сье с111е".гогаас(1еп(Ма!слез))) сопсспое е1зе: гог 1, вассе гп епоаегасе(зогсеб(Ма!сьев, кеу=зсг.1онег)): рг1пс("(О): (1)".гогвас(1 а 1, вассе)) а(псь = Сопзо1е.цес 1псецег("моаьег (ог 0 со сапсе1)", "поаЬег", а!п1вов=1, аах1воа=!еп(Ма!слез)) гесогп васспез[амсп - 1] гт ъп!сь 1= 0 е1зе моле х)тобы упростить и максимально ускорить поиск названия, пользователю предлагается ввести один или несколько начальных символов названия.
Получив начало названия, функция выполняет итерации по данным в ПВМ и создает список найденных совпадений. Если имеется всего одно совпадение, оно возвращается, а если имеется несколько совпадений (но не более чем целочисленное значение 018РЕАУ Е1М1Т, которое устанавливается где-то в другом месте программы), то они выводятся в алфавитном порядке без учета регистра символов, с порядковыми номерами перед ними, чтобы пользователь мог сделать выбор простым вводом числа. (Функция Сопзо1е. Оег 1пгецег() принимает О, даже если значение аргумента в!львов больше нуля, благодаря чему значение О может использоваться как признак отмены операции. Эту особенность поведения можно отключить, для чего достаточно передать аргумент аПон сего=ра1зе.
Мы не можем использовать для отмены простое нажатие клавиши Ел(ег, потому что ввод пустой строки рассматривается как ввод значения по умолчанию.) бег 1пп буба(бь): зсагс = "" с( 1еп(бо) > 013РЕАУ [1М1Т: зсагС = Сопзо1е.цеС зггспц("С!зС !Позе згагС1пц н!СЬ "[епсег=а11]", "зсагс") рппс() гог сы1е сп зогсеб(бь, кеу=зсг.1оаег); !г пос зсагс ог ссс1е.)оаег().зсагсзн1сп(ыагс,1онег()), бсгессог, уеаг, богас1оп = бь[ссс1е] ргспс("(0) ((1)) (2) в!песе(3), ьу (4)".(огаас( С!11е, уеаг, бога!!оп, ОСП .з(бога!!оп), бсгессог)) Вывод списка всех дисков (или только тех, названия которых начинаются с определенной подстроки) реализуется простым обходом всех элементов в базе данных.
513 Базы данных 5ОЬ Функция 01з1.5() определена как 5 = 1азсба х; "" з( х == 1 е15е "5"; здесь она возвращает символ «з», если продолжительность фильма превышает одну минуту. бе( гезоче бчб(бЬ).' 1111е = гзпб бчб(бь, "геэоче") 1( 11115 15 Зопе: гогогп аП5 = СОП5О1о.дЕГ ЬОО1(гаЕЭОЧЕ (0)О".ГОГазг(1111Е), "ПО") 1( дп5; бе1 со[111151 бЬ 5Чпс() Удаление диска заключается в том, чтобы отыскать диск, который пользователь желает удалить, запросить подтверждение и в случае его получения выполнить удаление элемента из РВМ.