- •Научно-исследовательская работа Тема: «Основы работы с базами данных» Дисциплина: «Производственная практика. Научно-исследовательская работа»
- •Этап 1 нир. Работа с данными sqLite в программах на языке Python
- •Чтение и отображение содержимого одной из таблиц в бд
- •Этап 2 нир.
- •Этап 3 нир. Задание для этапа 3 нир
- •Описание выполнения:
- •Результаты тестирования:
- •Примеры работы программы:
- •Код программы:
Код программы:
#НИР часть 3
# А-02-20 Дашин И.Н.
import sqlite3
import sys
import os
from tabulate import tabulate
def tablePrint():
"""Функция печати выбранной таблицы БД"""
def printData(tbName):
"""Функция получает имя таблицы
и возвращает имена полей и все значения из таблицы"""
con = sqlite3.connect("VUZ.sqlite")
cur = con.cursor()
sql = ' SELECT * FROM {}'.format(tbName)
data = cur.execute(sql).fetchall()
fields = cur.description
headers = [nam[0] for nam in fields]
print('')
print(tabulate( data, headers=headers, tablefmt='orgtbl'))
def printTables():
"""Функция принимает имя БД, печатает названия её таблиц и возвращает их"""
con = sqlite3.connect("VUZ.sqlite")
cur = con.cursor()
cur.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cur.fetchall()
tb = []
for table in tables:
tb.append(list(table)[0])
print("Таблицы БД VUZ.sqlite:")
for table in tb:
print( "- " + table)
return tb
def inputTbName(tables):
"""Функция принимает имя БД и список её полей,
проверяет вводимое имя таблицы """
while True:
tbName = input('Введите имя таблицы, которую хотите отобразить: ')
if not tbName in tables:
print("В БД VUZ.sqlite нет таблицы \"" + tbName + "\"")
print('')
print("Таблицы БД VUZ.sqlite:")
for table in tables:
print( "- " + table)
else:
break
return tbName
tables = printTables()
my_tbName = inputTbName(tables)
printData(my_tbName)
def tableProfMag():
"""Первая вспомогательная функция: получает от пользователя выбранный профиль вузов
и выводит наименования вузов этого профиля где ведется подготовка магистров """
def profMenu():
print('')
print("Доступные профили вузов:")
print('1) Инженерно-технический')
print('2) Классический университет')
print('3) Гуманитарно-педагогический')
print('4) Многопрофильный')
print('0) Выход из меню')
cmd = input('Выберите профиль вуза по номеру: ')
return cmd
def getProfInput():
cmd=profMenu()
while cmd != "0":
if cmd == "1":
return "ИТ"
elif cmd == "2":
return "КЛ"
elif cmd == "3":
return "ГП"
elif cmd == "4":
return "МП"
else:
print("Такого профиля нет!")
cmd=profMenu()
return cmd
prof = getProfInput()
if(prof=="0"): return
con=sqlite3.connect('VUZ.sqlite')
cur=con.cursor()
sql="""SELECT z1
FROM vuzkart
JOIN vuzstat ON vuzkart.codvuz == vuzstat.codvuz
WHERE vuzstat.mag>0 AND prof=="{}";""".format(prof)
data = cur.execute(sql).fetchall()
cur.close()
con.close()
count=[]
for i in range(len(data)):
count.append(i+1)
headers = ["Полное наименование вуза"]
print('')
print(tabulate(data, headers=headers, showindex=count))
def tableStatus():
"""Вторая вспомогательная функция: получает в качастве аргумента выбранный статус вуза
и выводит количество обучающихся в нем аспирантов, магистров и их численное соотношение"""
def statusMenu():
print('')
print("Доступные статусы вузов:")
print('1) Университет')
print('2) Академия')
print('3) Институт')
print('4) Выбрать все')
print('0) Выход из меню')
cmd = input('Выберите статус вуза по номеру: ')
return cmd
def getStatusInput():
cmd=statusMenu()
while cmd != "0":
if cmd == "1":
return "Университет "
elif cmd == "2":
return "Академия "
elif cmd == "3":
return "Институт "
elif cmd == "4":
return
else:
print("Такого статуса нет!")
cmd=statusMenu()
return cmd
status = getStatusInput()
if(status=="0"): return
con=sqlite3.connect('VUZ.sqlite')
cur=con.cursor()
if status != None:
sql="""SELECT vuzkart.z1, vuzstat.asp, vuzstat.mag
FROM vuzkart
JOIN vuzstat ON vuzkart.codvuz== vuzstat.codvuz
WHERE status=="{}"
ORDER BY vuzkart.z1""".format(status)
else:
sql="""SELECT vuzkart.z1, vuzstat.asp, vuzstat.mag
FROM vuzkart
JOIN vuzstat ON vuzkart.codvuz== vuzstat.codvuz
ORDER BY vuzkart.z1"""
cur.execute(sql)
data=cur.fetchall()
cur.close()
con.close()
count=[]
for i in range(len(data)):
count.append(i+1)
if (data[i][2]!=0):
data[i]+=(round(data[i][1]/data[i][2],2),)
else: data[i]+=(0,)
mag=0
asp=0
for i in range(len(data)):
asp+=data[i][1]
mag+=data[i][2]
count.append("-")
if (mag!=0):
data+=(("ИТОГО", asp, mag, round(asp/mag,2)),)
else: data+=(("ИТОГО", asp, mag, 0),)
headers = ["Полное наименование вуза", "Количество аспирантов", "Количество магистров", "Отношение аспиранты/магистры"]
print('')
print(tabulate(data, headers=headers, showindex=count, tablefmt='orgtbl'))
def menu():
print('')
print('Меню:')
print('1) Вывести таблицу с наименованиями вузов, имеющих подготовку магистров, выбрав интересующий профиль вузов')
print('2) Вывести таблицу с информацией об обучающихся магистрах и аспирантах, выбрав интересующий статус вузов')
print('3) Выбрать таблицу БД для отображения')
print('0) Завершить работу с программой')
cmd = input('Выберите действие: ')
return cmd
def main():
path=os.getcwd()
if(not os.path.exists(path+"\\VUZ.sqlite")):
print("В директории программы отсутствует требуемая БД, работа невозможна.")
return
else: print("Соединение с требуемой БД установлено!")
cmd=menu()
while cmd != "0":
if cmd == "1":
tableProfMag()
elif cmd == "2":
tableStatus()
elif cmd == "3":
tablePrint()
else:
print("Такой команды нет!")
cmd=menu()
return
main() #Вот и вся программа...
Вывод
В научно-исследовательской работе были изучены основы работы с базами данных, создание пользовательского интерфейса с выбором действия в виде оформленного меню. Было выполнено индивидуальное задание с применением навыков программирования на языке python.