Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Робота з базою даних в Python-програмах




Лабораторна робота № 8

з дисципліни «Інструментальні засоби Web-дизайну»

 

 

Виконав: ст. гр. 2ПІ-14б

Козловський Станіслав

Перевірив: доцент,
Хошаба О. М.

 

 

Вінниця 2017р.

Тема: робота з базами даних. Відомі фреймворки Рython.

 


Робота з БД в Рython

Основні поняття реляційної СУБД

Реляційна база даних - це набір таблиць з даними.

Таблиця - це прямокутна матриця, яка складається з рядків і стовпців. Таблиця задає відношення (relation).

Рядок - це запис, що складається з полів - стовпців. У кожному полі може міститися деяке значення, або спеціальне значення NULL (пусто). У таблиці може бути довільна кількість рядків. Для реляційної моделі порядок розташування рядків не визначений і не важливий.

Кожен стовпець таблиці має власне ім'я та тип.

 

Що таке DB-API 2

Винесена в заголовок абревіатура об'єднує два поняття: DB (Database, база даних) та API (Application Program Interface, інтерфейс прикладної програми).

Таким чином, DB-API визначає інтерфейс прикладної програми з базою даних. Цей інтерфейс, описаний нижче, повинен реалізовувати всі модулі розширення, які служать для зв'язку Python-програм з базами даних. Єдиний API (зараз його друга версія) дозволяє абстрагуватися від марки використовуваної бази даних, при необхідності досить легко змінювати СУБД на іншу, вивчивши всього один набір функцій і методів.

DB-API 2.0 описаний в PEP 249, і дане нижче опис засноване саме на ньому.


 


Опис DB API 2.0

DB API 2.0 регламентує інтерфейси модуля розширення для роботи з базою даних, методи об'єкта-з'єднання з базою, об'єкта-курсору поточної оброблюваної запису, об'єктів різних типів даних та їх конструкторів, а також містить рекомендації для розробників по реалізації модулів. На сьогодні Python підтримує через модулі розширення багато відомих бази даних (уточнити можна на web-сторінці за цією адресою). Нижче розглядаються майже всі положення DB-API, за винятком рекомендацій для розробників нових модулів.

 

Інтерфейс модуля

Тут необхідно сказати про те, що інтерфейс повинен надавати модуль для задоволення вимог DB-API 2.0.

Доступ до бази даних здійснюється за допомогою об'єкта-з'єднання (connection object). DB-API-сумісний модуль повинен надавати функцію - конструктор connect() для класу об'єктів-з'єднань. Конструктор повинен мати такі іменовані параметри:

· dsn – Назва джерела даних у вигляді рядка

· user – Ім'я користувача

· password – Пароль

· host – Адресу хоста, на якому працює СУБД

· database – Ім'я бази даних.

Модуль визначає константи, що містять його основні характеристики:

· apilevel–Версія DB-API ("1.0" або "2.0").

· threadsafety–Цілочисельнаконстанта, щоописуєможливостімодуляпривикористанніпотоківуправління:

o Модуль не підтримує потоки.

o Потоки можуть спільно використовувати модуль, але не з'єднання.

o Потоки можуть спільно використовувати модуль і з'єднання.

o Потоки можуть спільно використовувати модуль, з'єднання і курсори. (Під спільним використанням тут розуміється можливість використання згаданих ресурсів без застосування семафорів).

• paramstyle - Тип використовуваних позначок при підстановці параметрів. Можливі значення цієї константи:

o "format" - Форматування в стилі ANSI C (наприклад, "%s" як "%i" ).

o "pyformat" - Використання іменованих спецификаторов формату в стилі Python ( "%(item)s" )

o "qmark" - Використання знаків "?" для позначення місць підстановки параметрів.

o "numeric" - Використання номерів позицій ( ":1" ).

o "named" - Використання імен подставляемых параметрів ( ":name" ).

 

Модуль повинен визначати ряд виключень для позначення типових виняткових ситуацій: Warning (попередження), Error (помилка), InterfaceError (помилка інтерфейсу), DatabaseError (помилка, що відноситься до бази даних). А також підкласи цього останнього винятки: DataError (помилка обробки даних), OperationalError (помилка в роботі або збій з'єднання з базою даних), IntegrityError (помилка цілісності бази даних), InternalError (внутрішня помилка бази даних), ProgrammingError (програмна помилка, наприклад, помилка в синтаксисі SQL-запиту), NotSupportedError (при відсутності підтримки потрібної властивості).

 

Об'єкт-з'єднання

Об'єкт-з'єднання, що отримується в результаті успішного виклику функціїconnect(), повинен мати наступні методи:

· close() Закриває з'єднання з базою даних.

· commit() Завершує транзакцію.

· rollback() Відкочує розпочату транзакцію (відновлює початковий стан). Закриття з'єднання при незавершеною транзакції автоматично виробляє відкат транзакції.

· cursor() Повертає об'єкт-курсор, який використовує дане з'єднання. Якщо база даних не підтримує курсори, модуль сполучення повинен їх імітувати.

 

Під транзакцією розуміється група з однієї або кількох операцій, які змінюють базу даних. Транзакція відповідає логічно неподільної операції над базою даних, а часткове виконання транзакції призводить до порушення цілісності

Наприклад, при переказі грошей з одного рахунку на іншій операції по зменшенню першого рахунку і збільшення другого є транзакцією. Методи commit() та rollback() позначають початок і кінець транзакції в явному вигляді. Але не всі бази даних підтримують механізм транзакцій.

В залежності від реалізації DB-API 2.0 модуля, необхідно зберігати посилання на об'єкт-з'єднання продовження роботи курсорів цього з'єднання. Зокрема, це означає, що не можна відразу ж отримувати об'єкт-курсор, не прив'язуючи об'єкт-з'єднання до деякого імені. Також не можна залишати об'єкт-з'єднання локальної змінної, повертаючи з функції або методу об'єкт-курсор.

 

Об'єкт-курсор

Курсор (від англ. cursor - CURrrent Set Of Records, поточний набір записів) служить для роботи з результатом запиту. Результатом запиту зазвичай є одна або кілька прямокутних таблиць із стовпцями-полями і рядками-записами. Додаток може читати і обробляти отримані таблиці і записи в ній по одній, тому у курсорі зберігається інформація про поточну таблицю і запис. Конкретний курсор у будь-який момент часу пов'язаний з виконанням однієї SQL-інструкції.

Атрибути об'єкта-курсору теж визначені DB-API:

• arraysize –Атрибут, що дорівнює кількості записів, що повертаються методомfetchmany(). За замовчуванням дорівнює 1.

• callproc(procname[, params]) –Викликає збережену процедуру procname з параметрами з мінливою послідовності params. Збережена процедура може змінити значення деяких параметрів послідовності. Метод може повернути результат, доступ до якого здійснюється через fetch - методи.

• close() – Закриває об'єкт-курсор.

• description –Цей доступний тільки для читання атрибутів є послідовністю з семиэлементных послідовностей. Кожна з цих послідовностей містить інформацію, що описує один стовпець результату:

(name, type_code, display_size, internal_size, precision, scale, null_ok)

 

Перші два елементи (ім'я і тип) обов'язкові, а замість інших (розмір для висновку, внутрішній розмір, точність, масштаб, можливість завдання порожнього значення) може бути значення None. Цей атрибут може дорівнювати None для операцій, що не повертають значення.

• execute(operation[, parameters]) –Виконує запит до бази даних або команду СУБД. Параметри ( parameters ) можуть бути представлені у прийнятій в базі даних нотації у відповідності з атрибутом paramstyle, описаним вище.

• executemany(operation, seq_of_parameters) –Виконує серію запитів або команд, підставляючи параметри в заданий шаблон. Параметр seq_of_parameters задає послідовність наборів параметрів.

• fetchall() – Повертає всі (або всі) запису результату запиту.

• fetchmany([size]) –Повертає наступні кілька записів з результатів запиту у вигляді послідовності послідовностей. Порожня послідовність означає відсутність даних. Необов'язковий параметр size вказує кількість повернутих записів (реально повернутих записів може бути менше). За замовчуванням size дорівнює атрибуту arraysize об'єкта - курсора.

• fetchone() –Повертає наступну запис (у вигляді послідовності) з результату запиту або None при відсутності даних.

• nextset() –Переводить курсор до початку наступного набору даних, отриманого в результаті запиту (при цьому частина записів у попередньому наборі може залишитися непрочитаної). Якщо наборів більше немає, повертає None. Не всі бази даних підтримують повернення декількох наборів результатів за одну операцію.

• rowcount –Кількість записів, отриманих або порушених у результаті виконання останнього запиту. У разі відсутності execute-запитів або неможливості вказати кількість записів дорівнює -1.

• setinputsizes(sizes) –Зумовлює області пам'яті для параметрів, що використовуються в операціях. Аргумент sizes задає послідовність, де кожен елемент відповідає одному вхідному параметру. Елемент може бути об'єктом-типом відповідного параметра або цілим числом, задає довжину рядка. Він також може мати значення None, якщо про розмір вхідного параметра нічого не можна сказати заздалегідь або він передбачається дуже великим. Метод повинен бути викликаний до execute-методів.

• setoutputsize(size[, column]) –Встановлює розмір буфера для вихідного параметра стовпця з номером column. Якщо column не задано, метод встановлює розмір для всіх великих вихідних параметрів. Може використовуватися, наприклад, для отримання великих двійкових об'єктів (Binary Large Object, BLOB).


 


Об'єкти, типи

DB-API 2.0 передбачає назви для об'єктів-типів, які використовуються для опису полів бази даних:

Объект Тип
STRING Рядок і символ
BINARY Бінарний об’єкт
NUMBER Число
DATETIME Дата и час
ROWID Ідентифікатор запису
None NULL-значення (відсутнє значення)

 

З кожним типом даних (в реальності це - класи) пов'язаний конструктор. Сумісний з DB-API модуль повинен визначати наступні конструктори:

· Date(рік, місяць, день) Дата.

· Time(година, хвилина, секунда) Час.

· Timestamp(рік, місяць, день, година, хвилина, секунда) Дата-час.

· DateFromTicks(secs) Дата у вигляді числа секунд secs від початку епохи (на 1 січня 1970 року).

· TimeFromTicks(secs) Час, те ж.

· TimestampFromTicks(secs) Дата-час, те ж.

· Binary(string) Великий двійковий об'єкт на підставі рядка string.

 

Робота з базою даних в Python-програмах

Далі на конкретних прикладах показано, як працювати з базою даних з програми на мові Python. Прості приклади дозволять зрозуміти, що при програмуванні на Python доступ до бази даних не складніше доступу до інших джерел даних (файлів, мережевих об'єктів).

Саме тому для демонстрації обрана СУБД SQLite, що працює як під Unix, так і під Windows. Крім установки власне SQLite і модуля сполучення з Python, яких-небудь додаткових налаштувань проводити не потрібно, так як SQLite зберігає дані бази в окремому файлі: відразу приступати до створення таблиць, занесення в них даних та добутку запитів не можна. Обрана СУБД (в силу своєї "легкості") має одну суттєву особливість: за одним невеликим винятком, СУБД SQLite не звертає уваги на типи даних (вона зберігає всі дані у вигляді рядків), тому модуль розширення sqlite для Python виконує додаткову роботу з перетворення типів. Крім того, СУБД SQLite підтримує достатньо великий набір властивостей стандарту SQL92, залишаючись при цьому невеликий і швидкою, що важливо, наприклад, для web-додатків. Досить сказати, що SQLite підтримує транзакції.

Вибір бази даних не впливає на синтаксис використаних коштів, так як модуль sqlite, який буде використовуватися, підтримує DB-API 2.0, а отже, перехід на будь-яку іншу СУБД потребує мінімальних змін у виклику функції connect() і, можливо, використання більш вдалих типів даних, властивих цільової СУБД.

 

Схематично робота з базою даних може виглядати приблизно так:

· Підключення до бази даних (виклик connect() з отриманням об'єкта-з'єднання).

· Створення одного або декількох курсорів (виклик методу об'єкта-з'єднання cursor() з отриманням об'єкта-вказівника).

· Виконання команди або запиту (виклик методу execute() чи його варіантів).

· Отримання результатів запиту (виклик методу fetchone() чи його варіантів).

· Завершення транзакції або її відкат (виклик методу об'єкта-з'єднанняcommit() або rollback() ).

· Коли всі необхідні транзакції проведені, підключення закривається викликом методу close() об'єкта-з'єднання.

Знайомство з СУБД

Припустимо, програмне забезпечення встановлено правильно, і можна працювати з модулем sqlite. Варто подивитися, чому будуть дорівнювати константи:

>>> import sqlite

>>> sqlite.apilevel '2.0'

>>> sqlite.paramstyle 'pyformat'

>>> sqlite.threadsafety 1

 

Звідси випливає, що sqlite підтримує DB-API 2.0, підстановка параметрів виконується в стилі рядка форматування мови Python, а з'єднання можна використовувати спільно з різних потоків управління (без блокувань).

 

Створення бази даних

Для створення бази даних потрібно встановити, які таблиці та інші об'єкти, наприклад індекси) в ній будуть зберігатися, а також визначити структури таблиць (імена і типи полів).

Завдання - створення бази даних, в якій буде зберігатися телепрограма. В цій базі буде таблицю з наступними полями:

· tvdate,

· tvweekday,

· tvchannel,

· tvtime1,

· tvtime2,

· prname,

· prgenre.

 

Тут tvdate - дата, tvchannel - канал, tvtime1 і tvtime2 - час початку і кінця передачі, prname - назва, prgenre - жанр. Звичайно, в цій таблиці є функціональна залежність ( tvweekday обчислюється на основі tvdate і tvtime1 ), але з практичних міркувань БД до нормальних форм наводитися не буде. Крім того, буде створена таблиця з назвами днів тижня (встановлює відповідність між номером дня і днем тижня):

· weekday,

· wdname.

 

Наступний сценарій створить таблицю в базі даних (у випадку з SQLite дбати про створення бази даних не потрібно: файл створиться автоматично. Для інших баз даних необхідно перед цим створити базу даних, наприклад, SQL-інструкції CREATE DATABASE ):

import sqlite as db

 

c = db.connect(database="tvprogram") cu = c.cursor()

 

try:

cu.execute(""" CREATE TABLE tv (

tvdate DATE, tvweekday INTEGER,

tvchannel VARCHAR(30), tvtime1 TIME,

tvtime2 TIME,

prname VARCHAR(150), prgenre VARCHAR(40)

); """)

except db.DatabaseError, x: print "Ошибка: ", x

c.commit()

 

try:

cu.execute(""" CREATE TABLE wd (

weekday INTEGER, wdname VARCHAR(11)

); """)

except db.DatabaseError, x: print "Ошибка: ", x

c.commit()

c.close()

 

Тут просто виконуються SQL-інструкції, та обробляється помилка бази даних, якщо така станеться (наприклад, при спробі створити таблицю з уже існуючим ім'ям). Для того щоб таблиці створювалися незалежно, використовується commit().

Видалити таблиці бази даних можна наступним чином:

import sqlite as db

 

c = db.connect(database="tvprogram") cu = c.cursor()

 

try:

cu.execute("""DROP TABLE tv;""") except db.DatabaseError, x:

print "Ошибка: ", x c.commit()

 

try:

cu.execute("""DROP TABLE wd;""") except db.DatabaseError, x:

print "Ошибка: ", x c.commit()

c.close()

 

Інші СУБД і Python

Модуль sqlite дає прекрасні можливості для побудови невеликих і швидких баз даних, однак для повноти викладу пропонується огляд модулів розширення Python для інших СУБД.

Вище скрізь імпортувався модуль sqlite, зі зміною його імені на db. Це було зроблено не випадково. Справа в тому, що подібні модулі, що підтримують DB-API 2.0, є і для інших СУБД, і навіть не в однині. Згідно інформації про DB-API 2.0-сумісні модулі для Python мають такі СУБД або протоколи доступу до БД:

· zxJDBC – Доступ по JDBC.

· MySQL – Для СУБД MySQL.

· mxODBC – Доступ по ODBC.

· DCOracle2, cx_Oracle – ДляСУБД Oracle.

· PyGresQL, psycopg, pyPgSQL – ДляСУБД PostgreSQL.

· Sybase – Для Sybase.

· sapdbapi – Для СУБД SAP.

· KInterbasDB – Для СУБД Firebird.

· PyADO – Адаптерк Microsoft ActiveX Data Objects (тількипід Windows).

 

Для СУБД PostgreSQL потрібно взяти не PyGreSQL, а psycopg, так як в першому є невеликі проблеми з типом для дати і часу при вставці параметрів у методі execute(). Крім того, psycopg оптимізований для швидкості і багатопоточності ( psycopg.threadsafety=2 ).

Таким чином, у прикладах, які використовуються, замість sqlite можна застосовувати, наприклад, psycopg: результат повинен бути тим же, якщо, звичайно, відповідний модуль був встановлений.

 

Однак у загальному випадку при переході з однієї СУБД на іншу можуть виникати розбіжності, навіть, незважаючи на підтримку однієї версії DB-API. Наприклад, у модулів можуть відрізнятися paramstyle. В цьому випадку доведеться трохи переробити параметри виклику execute(). Можуть бути і інші причини, тому перехід на іншу СУБД слід ретельно тестувати.

Мати інтерфейс DB-API можуть не тільки бази даних. Наприклад, розробники проекту fssdb можуть побудувати DB-API 2.0 інтерфейс файлової системи.

Незважаючи на досить гарні теоретичні основи і стабільні реалізації, реляційна модель - не єдина успішно використовуються сьогодні. Деревовидна модель даних XML для багатьох завдань є більш природною, і в даний час йдуть дослідження, результати яких дозволять працювати з XML так само легко і стабільно, як з реляційними СУБД. Мова програмування Python - один із полігонів цих досліджень.

Вирішуючи конкретну задачу, розробник програмного забезпечення повинен зробити вибір засобів, найбільш доцільних для вирішення завдання. Дуже багато підходять до цього вибору з упередженістю, вибираючи неоптимальную (для даної задачі або підзадачі) модель даних. В результаті дані, які за своєю природою легше уявити іншою моделлю, доводиться зберігати та обробляти в обраній моделі, часто мимоволі моделюючи більш природні структури доступу і зберігання. Так, XML можна зберігати в реляційної БД, а табличні дані в XML, однак це неприродно. З-за цього складність і схильність до помилок програмного продукту зростають, навіть якщо використані інструменти високої якості.


 


В підсумку

Були розглянуті можливості зв'язку Python з системами управління реляційними базами даних. Для Python розроблений стандарт, званий DB-API (версія 2.0), якого повинні дотримуватися всі розробники модулів сполучення з реляційними базами даних. Завдяки цьому API код прикладної програми стає менш залежним від марки використовуваної бази даних, його можуть зрозуміти розробники, що використовують інші бази даних. Фактично DB-API 2.0 описує імена функцій і класів, які повинен містити модуль сполучення з базою даних, і їх семантику. Модуль сполученняповинен містити клас об'єктів-з'єднань з базою даних і клас для курсорів - спеціальних об'єктів, через які відбувається комунікація з СУБД на прикладному рівні.

Тут була використана СУБД SQLite і відповідний модуль розширення Python для сполучення з цієї СУБД - sqlite, так як він підтримує DB-API 2.0 і досить простий в установці.

 

Відомі фреймворки Рython

Django

Django це вільний веб-фреймворк на мові Python, який є, напевно, найпопулярнішим веб-фреймворком на Python. Django слід шаблоном програмування MVC (Model-View-Controller). Сайт на Django будується з одного або декількох додатків, які рекомендується робити відчужуваними і підключаються. Головне переваг Django, що відрізняють його від своїх конкурентів є хороша документація в тому числі і російською мовою.

Django підтримує роботу з основними базами даних — MySQL, PostgreSQL та Oracle. Він надає рівень абстракції, який позбавляє від необхідності писати SQL-запити для отримання/збереження даних в базу даних. Всі таблиці, що використовуються сайтом, описуються у вигляді класів в окремому файлі models.py. Далі за допомогою методів цих класів, відбувається маніпуляція з вмістом таблиць. Таким чином, робота з базою даних стає повністю об'єктно-орієнтованою.

Так само в Django є вбудований інтерфейс адміністратора, через який в зручній формі можна працювати з контентом сайту.

Напевно тому він має саме велике співтовариство серед веб-фреймворків на Python.

 

TurboGears

Так само, як і Django, TurboGears був розроблений для швидкого створення новинних сайтів. TurboGears це Python веб фреймворк, який складається з декількох складових компонент, таких як:

· CherryPy для диспетчеризації url;

· MochiKit для роботи з Javascript;

· SQLObject для роботи з базою даних;

· Kid для роботи з шаблонами.

З недоліків можна відзначить — погана сумісність 1.x і 2.x версій і не сама хороша документація.

 

Pylons

Pylons являє собою легкий веб-фреймворк який робить наголос на гнучкість та швидкість розробки. В даний час розвиток Pylons завершено на версії 1.0 і подальшого істотного зміни не планується.

Pylons один з перших проектів, який почав використовувати стандарт WSGI і орієнтований на те, щоб зробити веб-розробку швидкою, гнучкою і якомога простішою.

Що стосується документації, то Pylons нею абсолютно не займається.

Zope

Zope являє собою сервер веб-додатків, написаний на Python і призначений для створення систем управління контентом, інтранет-додатків, порталів та інших проектів. Zope розшифровується як «Z Object Publishing Environment» (Середа Публікації Об'єктів Z). Особливістю Zope є об'єктно-орієнтованість. Усі дані представляються у вигляді компонентів, що займають певне місце в загальній ієрархії і зберігаються у вбудованій об'єктної бази даних — ZoBD. І тому програмування в Zope зводиться до проектування ієрархії компонентів.

Російськомовної документації по Zope практично немає.

 

Twisted

Twisted є фрэймворком для написання мережевих додатків на Python. Ґрунтується на парадигмі подійно-орієнтованого програмування. Користувач пише функції зворотного виклику, які потім викликаються фреймворком. Він підтримує безліч протоколів, має модулі для створення web-серверів, чат-клієнтів і серверів, поштових серверів, ssh-серверів.

 

Web2py

Безкоштовний і з відкритим кодом, повноцінний фреймворк рівня підприємства для гнучкої розробки веб-додатків для доступу до БД. Web2py дозволяє створювати і розробляти програми прямо в онлайні. В цілому він дуже схожий на Django.

 

Webware

Webware для Python являє собою набір Python пакетів для розробки об'єктно-орієнтованих веб додатків.

 

CherryPY

CherryPy це об'єктно-орієнтований HTTP фреймвокр. Він являє собою надбудову над http-протоколом і може виступати в якості самостійного веб-сервера або працювати під управлінням іншого серверного додатка, що підтримує протокол WSGI. CherryPy не займається обробкою шаблонів д, доступ до бази даних і авторизація користувача.

 

Porcupine

Porcupine це Python сервер веб-додатків представляє собою об'єктно-орієнтований фреймворк для швидкої розробки Багатих Інтернет додатків (Rich Internet Applications).

 

Karrigell

Karrigell це фреймворк для роботи з БД в середовищі Python. Він працює як веб-сервер і база даних Python (PyDbLite), але може працювати і з іншими базами даних.

 

Flask

Мікро веб-фреймворк на мові Python збудований на Werkzeug і Jinja2

 

Pysi

Як пише автор фреймворку: Pysi — це фреймворк «для себе». Якщо кодите на замовлення, побачите лише «ще один фреймворк».

Основна якість pysi — продуктивність.Друге за важливістю — простота.

Висновок: в результаті виконання лабораторної роботи було розглянуто основи та особливості роботи з базами даних в мові Python. Було досліджено особливості відомих фреймворків Python.










Последнее изменение этой страницы: 2018-04-12; просмотров: 292.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...