Оглавление
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 нир. Работа с данными 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 были записаны данные из одной записи в БД.
Ввод данных по запросу с клавиатуры и занесение их в таблицу
Установили связь с БД, вводим самостоятельно запрашиваемые данные и заносим в нее результат.
Дополнительно введу самостоятельно данные в одну из таблиц.
Этап 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() #Вот и вся программа...