
- •Электронный банк персональных информационных ресурсов студента
- •Оглавление
- •Введение
- •Структура личных ресурсов
- •Методика формирования пир Пользовательское представление
- •Техническое представление базы данных
- •Техническое представление программной реализации
- •Тезаурусное представление пир
- •Онтологическое представление
- •Универсальная десятичная классификация
- •Библиотечно-библиографическая классификация
- •Руководство пользователя Установка необходимого программного обеспечения
- •Запуск и использование программы
- •Используемые материалы
Техническое представление программной реализации
Программа написана на языке Python с использованием средства визуального оформления wxPython (на базе gtk) и ORM sqlalchemy как средство работы с базой данных. Структура программы стандартная для программ на основе wxPython. Основной класс mainFrame(wx.Window), который описывает визуальное представление. Основной компонент главное окна – дерево, построенное на основе wx.TreeCtrl. Второй компонент – wx.Listbook, дочерним компонентом которого является wx.Grid. wx.Grid построен на основе Grid.PyGridTableBase. Кроме того используются средства wx.Frame для вывода окон программы, таких как настройка типов файлов, расширений, хранилищ, окна тезауруса. Всю документацию по соответствующим компонентам можно найти на официальном сайте wxpython.org.
Реализация работы с базой данных построена на основе ORM sqlalchemy. Это очень гибкое средство, которое позволяет работать с различными базами данных. В данной работе была выбрана база данных MySQL, но установка параметров в строке
engine = create_engine('mysql://root@192.168.8.1:3306/xaklib', echo=True)
приведёт к использованию любой другой поддерживаемой базы данных без фактического изменения остального кода.
Структура данных представляется классами-наследниками объекта Base, который является экземпляром класса DeclarativeBase (в Python возможна подобная архитектура приложения, когда класс фактически объявляется как наследник экземпляра другого класса).
Пример подобного класса:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, Unicode, Date, MetaData, Boolean, String, UnicodeText
Base = declarative_base()
class extensions(Base):
__tablename__ = 'extensions'
id = Column(Integer, primary_key=True)
name = Column(Unicode, key='name')
type = Column(Integer)
def __init__(self, name, type):
self.name = name
self.type = type
Запросы осуществляются посредством встроенных средств вида session.query(extensions).filter(extensions.type==2), где Session = scoped_session(sessionmaker(bind=engine))
session = Session()
Основные приёмы работы с sqlalchemy описаны на сайте sqlalchemy.org.
Следует помнить, что объект session должен создаваться один раз за время работы программы, поэтому его следует либо объявлять в глобальной области видимости, либо передавать как параметр взаимодействующим классам.
Также следует знать, что sqlalchemy не делает кеширование, поэтому некоторые запросы, особенно для больших объемов, могут выполняться довольно долго. Но оптимизацию запросов он выполняет. Например, если мы производим удаление объектов перебором по каждому элементу для удаления, то есть выполняем код вида:
q = self.session.query(films).filter(films.name.like(‘%сумерки%’))
for i in q:
self.session.delete(q)
self.session.commit()
то запросов к базе данных будет не по количеству выбранных фильмов, а только один (естественно при условии, что commit мы вызываем после цикла), то есть запрос будет вида:
DELETE FROM films WHERE films.id = %s
((131L,), (132L,), (133L,), (134L,), (135L,), (136L,), (137L,), (138L,))
Как видно из вышеприведённого запроса, автоматом используются так называемые placeholderы, которые позволяют исключить sql-инъекции.