Скачиваний:
0
Добавлен:
26.01.2024
Размер:
8.15 Кб
Скачать
#НИР часть 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() #Вот и вся программа...
Соседние файлы в папке нир