Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
нир / НИР_Дашин_А-01-20.docx
Скачиваний:
1
Добавлен:
26.01.2024
Размер:
1.52 Mб
Скачать

Оглавление

1. Этап 1 НИР. Работа с данными SQLite в программах на языке Python 2

Создание БД bd1.sqlite с 2 таблицами: stud и sessija 2

Запись данных в таблицы 3

Множественная вставка данных в табл. БД 3

Чтение и отображение содержимого одной из таблиц в БД 4

Чтение данных из таблицы БД 5

Получение списка таблиц в составе БД. 5

Считывание информации о структуре таблицы, имеющейся в БД 6

Ввод данных по запросу с клавиатуры и занесение их в таблицу 6

2. Этап 2 НИР. 7

Создание базы данных, содержащую одну таблицу с заданной структурой. 7

Обзор функционала созданной программы. 8

Код программы: 13

1. Этап 3 НИР. 17

Задание для этапа 3 НИР 17

Описание выполнения: 18

Результаты тестирования: 19

Примеры работы программы: 21

Код программы: 23

  1. Этап 1 нир. Работа с данными sqLite в программах на языке Python

Средства для работы с БД SQLite содержатся в среде Python сразу после ее инсталляции. Доказательством этого служит наличие библиотеки sqlite3.dll, находящейся по месту установки Python в каталоге DLLs:

И наличие подкаталога sqlite в каталоге Lib:

Подготовка к работе:

Создание БД bd1.sqlite с 2 таблицами: stud и sessija

Была создана новая БД, а также переменная курсор. В результате, в рабочем каталоге появляется файл bd1.sqlite.

Запись данных в таблицы

Было устанавлено соединение с БД. Созданы курсор, переменная с SQL- командами вставки записи в таблицу stud.

Были закрыты курсор и БД.

Множественная вставка данных в табл. БД

# Создаем список с элементами-кортежами, содержащими значения полей таблицы,

Была выполнена «множественная» команда вставки строк из arr в таблицу sessija, закрыты курсор и БД.

Чтение и отображение содержимого одной из таблиц в бд

#### Создаем и выполняем программу test3.py, позволяющую увидеть содержимое указанной таблицы в заданной БД

#### Запуск на выполнение программы test3:

Была запущена на выполнение программа test3 и введено имя ранее созданной БД и одной из таблиц.

Мы получили отображение нашей таблицы.

Чтение данных из таблицы БД

Пусть имеется БД bd1.sqlite, содержащая таблицу stud. Получим содержимое всех записей этой таблицы.

Получение списка таблиц в составе БД.

Для использования БД VUZ.sqlite перенес в рабочий каталог.

Создан список кортежей, в которых содержатся имена входящих в БД таблиц. Закрыты курсор и БД.

Считывание информации о структуре таблицы, имеющейся в БД

Функция записана в атрибут row_factory объекта con (БД).

В объект ar были записаны данные из одной записи в БД.

Ввод данных по запросу с клавиатуры и занесение их в таблицу

Установили связь с БД, вводим самостоятельно запрашиваемые данные и заносим в нее результат.

Дополнительно введу самостоятельно данные в одну из таблиц.

  1. Этап 2 нир.

Создание базы данных, содержащую одну таблицу с заданной структурой.

Содержание поля

Тип информации в поле

Код дисциплины по учебному плану

Текст

Название дисциплины

Текст

Номер семестра с аттестацией по дисциплине

целое число

Тип аттестации (экзамен/зачет)

Текст

Дата аттестации

Дата

ФИО преподавателя, проводившего аттестацию

Текст

Должность преподавателя

Текст

Полученная оценка

целое число

Дата занесения/обновления записи

Дата

Обзор функционала созданной программы.

Программа выводит пустую таблицу нашей БД, так как в ней еще нет данных.

Заполняю её данными по экзаменам за последние 2 семестра из зачетной книжки.

Выбрав действие добавить строку заполняем ее поля. Отобразим таблицу:

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

Продемонстрирую функционал программы:

  • Сохранение таблицы в файл:

Проверяем наличие файла в каталоге с программой:

Таблица успешно выведена в файл.

  • Выбор одного из полей таблицы с условием для вывода его подмножества и отображение подходящих под условие элементов:

Пример 1:

Запросил все предметы, по которым имеется оценка 5 и отобразил их.

Пример 2:

Запросил Ф.И.О. всех преподавателей, принимавших у меня экзамен с должностью доцент.

  • Замена всех элементов подмножества, которые подходят под заданное условие

Пример:

Заменяю оценки у всех экзаменов на оценку 5. Проверим, выведя все экзамены с этой оценкой.

Действительно, оценки за все экзамены поменялись на оценку 5.

  • Удаление записей, поле которых имеет заданное значение:

Удаляю все записи с оценкой 5. Теперь в базе осталось всего две записи.

Программа выполняет все требуемые действия с любыми БД sqlite3. Пользователь может выбирать таблицы БД, добавлять, удалять, заменять записи, отображать требуемые ему записи по заданному условию, а также выводить таблицу в текстовый файл.

С помощью моей программы можно взаимодействовать не только с БД созданной по заданию. Например, так выглядит работа с БД “bd1.sqlite3” из первого этапа НИР:

Код программы:

#НИР часть 2

# А-02-20 Дашин И.Н.

import sqlite3

import sys

import os

from tabulate import tabulate

def takeData(dbName, tbName):

"""Функция получает имя БД и таблицы в ней

и возвращает имена полей и все значения из таблицы"""

con = sqlite3.connect(dbName)

cur = con.cursor()

sql = ' SELECT * FROM {}'.format(tbName)

data = cur.execute(sql).fetchall()

fields = cur.description

headers = [nam[0] for nam in fields]

return [headers, data]

def choseHeader(dbName, tbName):

"""Функция получает имя БД и таблицы в ней

и возвращает имя выбранного поля"""

headers, _ = takeData(dbName, tbName)

print("Доступные поля таблицы \""+ tbName + "\":")

for head in headers:

print( "- " + head)

while True:

headName = input('Выберите поле, с которым хотите взаимодействовать:')

if not headName in headers:

print("В таблице \""+ tbName + "\" нет поля \"" + headName + "\"!")

print('')

print("Выберите поле с которым хотите взаимодействовать: ")

for head in headers:

print( "- " + head)

else:

break

return headName

def inputRow(dbName, tbName):

"""Функция получает имя БД и таблицы в ней

и возвращает данные для формирования запроса на добавление строки:"""

headers, _ = takeData(dbName, tbName)

textZaprosa=""

textData=""

newData=[]

for head in headers:

textZaprosa += head +", "

textData += "?,"

newData.append(input("Введите новое значение для поля " + head +":"))

return [textZaprosa[:-2],textData[:-1], newData]

def addRow(dbName, tbName):

"""Функция получает имя БД и таблицы в ней

и совершает запрос для добавления строки в таблицу"""

con = sqlite3.connect(dbName)

cur = con.cursor()

textZaprosa, textData, newData = inputRow(dbName, tbName)

sql = """\

INSERT INTO {}

({})

VALUES ({})

""".format(tbName, textZaprosa, textData)

cur.execute(sql, tuple(newData))

con.commit()

cur.close()

con.close()

def deleteRow(dbName, tbName):

"""Функция получает имя БД и таблицы в ней

и удаляет строку с выбранным значением поля"""

header = choseHeader(dbName, tbName)

print("Для удаления строки ведите значение её поля \""+ header + "\":")

rowValue = input("Значение поля: ")

con = sqlite3.connect(dbName)

cur = con.cursor()

sql = """DELETE from {} where {}=?""".format(tbName, header)

cur.execute(sql, (rowValue,))

con.commit()

cur.close()

con.close()

print("строка с полем \""+ header + "\" = \""+ rowValue + "\" удалена. ")

def tableDisplay(dbName, tbName):

"""Функция получает имя БД и таблицы в ней

и печатает таблицу, оформленную с помощью библиотеки tabulate"""

headers, data = takeData(dbName, tbName)

print('')

print(tabulate( data, headers=headers, tablefmt='orgtbl'))

def tableFile(dbName, tbName):

"""Функция получает имя БД и таблицы в ней

и сохраняет таблицу в файл с выбранным названием"""

fileName = input('Введите имя файла для вывода:')

vr_out = sys.stdout

fc = open(fileName, 'w')

sys.stdout = fc

tableDisplay(dbName, tbName)

sys.stdout = vr_out

fc.close()

print("Таблица записана в файл \""+ fileName + "\" в текущий каталог.")

def condField(dbName, tbName):

"""Функция получает имя БД и таблицы в ней,

запрашивает у пользователя условие для отбора подмножества поля,

а затем возвращает данные с названием этого поля, подходящими под

условие элементами и текстом условия"""

header = choseHeader(dbName, tbName)

condition = input('Введите условие для отбора подмножества (Для выбора всех значений оставьте условие пустым): ')

con = sqlite3.connect(dbName)

cur = con.cursor()

if (condition == ''):

sql = 'SELECT {} FROM {}'.format(header, tbName)

else:

sql = 'SELECT {} FROM {} WHERE {}'.format(header, tbName, condition)

data = cur.execute(sql).fetchall()

cur.close()

con.close()

return [header, data, condition]

def updateField(dbName, tbName, header, newValue, condition):

"""Функция получает имя БД, имя таблицы

и данные для обновления выбранных полей: имя поля, условие и новое значение.

Формирует запрос при помощи полученных данных и исполняет замену значений"""

con = sqlite3.connect(dbName)

cur = con.cursor()

sql = """UPDATE {} SET {} =? WHERE {}""".format(tbName, header, condition)

cur.execute(sql, (newValue,))

con.commit()

cur.close()

con.close()

def fieldAction(dbName, tbName):

"""Функция получает имя БД и таблицы в ней

и является интерфейсом для работы со значениями полей"""

header, data, condition = condField(dbName, tbName)

cmd =fieldMenu() #Печать меню взаимодействия с элементами

while cmd != "0":

if cmd == "1":

print(tabulate(data, tablefmt='orgtbl')) #Печать элементов, подходящих под условия

elif cmd == "2":

newValue = input("Введите новое значение для элементов выбранного подмножества:")

updateField(dbName,tbName, header, newValue, condition) #Замена выбранных элементов на заданное значение

else:

print("Такой команды нет!")

cmd =fieldMenu()

return

def fieldMenu():

"""Функция выдает на печать меню для работы со значениями полей """

print('')

print('Что вы хотите сделать с выбранным подмножеством:')

print('1) Отобразить подмножество в виде таблицы')

print('2) Заменить подмножество заданным значением (Внимание! Поля с уникальными значениями замене не подлежат)')

print('0) Вернуться в меню')

cmd = input('Выберите действие: ')

return cmd

def printTables(dbName):

"""Функция принимает имя БД, печатает названия её таблиц и возвращает их"""

con = sqlite3.connect(dbName)

cursor = con.cursor()

cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")

tables = cursor.fetchall()

tb = []

for table in tables:

tb.append(list(table)[0])

print("Таблицы БД \"" + dbName +"\":")

for table in tb:

print( "- " + table)

return tb

def inputDbName():

"""Функция проверяет вводимое имя файла БД """

while True:

dbName = input('Введите файл БД, с которой хотите работать: ')

if not os.path.isfile(dbName):

print("Файла \"" +dbName + "\" нет в текущем каталоге")

else:

break

return dbName

def inputTbName(dbName, tables):

"""Функция принимает имя БД и список её полей,

проверяет вводимое имя таблицы """

while True:

tbName = input('Введите имя таблицы, с которой хотите работать: ')

if not tbName in tables:

print("В БД \""+ dbName + "\" нет таблицы \"" + tbName + "\"")

print('')

print("Таблицы БД \"" + dbName +"\":")

for table in tables:

print( "- " + table)

else:

break

return tbName

def menu():

"""Функция выдает на печать главное меню """

print('')

print('Меню:')

print('1) Отобразить текущее содержимое БД на экране в виде таблицы')

print('2) Сохранить таблицу в текстовый файл с заданным именем')

print('3) Добавить строку в БД')

print('4) Удалить выбранную строку ')

print('5) Выбор поля для задания условия')

print('0) Завершение работы с программой')

cmd = input('Выберите действие: ')

return cmd

def main():

"""Функция является интерфейсом программы и

осуществляет взаимодействие с пунктами главного меню"""

my_dbName = inputDbName() #Получение от пользователя имени БД

tables = printTables(my_dbName) #Получение и вывод доступных таблиц БД

my_tbName = inputTbName(my_dbName, tables) #Получение от пользователя таблицы

cmd=menu() #Отображение меню для взаимодействия с таблицой БД

while cmd != "0":

if cmd == "1":

tableDisplay(my_dbName, my_tbName) #Отображение таблицы

elif cmd == "2":

tableFile(my_dbName, my_tbName) #Сохранение таблицы в файл

elif cmd == "3":

addRow(my_dbName, my_tbName) #Добавление строки в таблицу

elif cmd == "4":

deleteRow(my_dbName, my_tbName) #Удаление строки из таблицы

elif cmd == "5":

fieldAction(my_dbName, my_tbName) #Взаимодействие с элементами

else:

print("Такой команды нет!")

cmd=menu()

return

main() #Вот и вся программа...

Соседние файлы в папке нир