Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
my_кмс.docx
Скачиваний:
25
Добавлен:
25.11.2018
Размер:
1.8 Mб
Скачать

Техническое представление программной реализации

Программа написана на языке 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-инъекции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]