Скачиваний:
0
Добавлен:
26.01.2024
Размер:
7.59 Кб
Скачать
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):
    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()
    print("Подмножество поля \""+ header + "\" удовлетворяющее условию:")
    return [header, data, condition]

def menu():
    print('')
    print('Меню:')
    print('1) Отобразить текущее содержимое БД на экране в виде таблицы')
    print('2) Сохранить таблицу в текстовый файл с заданным именем')
    print('3) Добавить строку в БД')
    print('4) Удалить выбранную строку ')
    print('5) Выбор поля для задания условия')
    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 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 fieldMenu():
    print('')
    print('Что вы хотите сделать с выбранным подмножеством:')
    print('1) Отобразить подмножество в виде таблицы')
    print('2) Заменить подмножество заданным значением (Внимание! Поля с уникальными значениями замене не подлежат)')
    print('0) Вернуться в меню')
    cmd = input('Выберите действие: ')
    return cmd

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 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()
Соседние файлы в папке нир