Добавил:
Vor_fleshek
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:нир / nir
.pyimport 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()
Соседние файлы в папке нир