#python #sql #python-3.x #tkinter #tkinter-entry
#python #sql #python-3.x #tkinter #tkinter-entry
Вопрос:
Я создал класс базы данных, экземплярами которого должны быть таблицы sql. У него есть 3 метода: один, который создает таблицу,
def create_table(self, *args):
c.execute('''CREATE TABLE IF NOT EXISTS {} {} '''.format(self.table_name, args))
conn.commit()
тот, который создает инструкцию sql INSERT INTO,
def insert_structure(self,mydict, table_name):
query = 'INSERT INTO {} VALUES ({}{})'
d = dict(mydict)
y = next(iter(d))
# table = d.pop(y)
columns = ',:'.join(d.keys())
placeholders = ','.join(['{}'] * len(d))
values = d.values()
f = str(query.format(table_name,':', columns, placeholders))
return f
и тот, который должен вставлять значения в таблицу (используя метод insert_structure).
def insert_data(self,dicty, list):
c.execute(self.insert_structure(dicty, self.table_name), dicty)
conn.commit()
for k in list:
k.delete(0, END)
для графического интерфейса я использовал tkinter, поэтому при запуске программы появляется окно с 4 записями и кнопкой
Кнопка принимает insert_data как команду со словарем «dicto» в качестве аргумента (я использую lambda, поэтому предполагается, что это работает).
dicto = {
'cow_id': cow_id.get(),
'lactation_phase': lactation_phase.get(),
'milk_production': milk_production.get(),
'weight': weight.get()
}
entries = [cow_id, lactation_phase, milk_production, weight ]
cows.create_table('cow_id REAL', 'lactation_phase TEXT', 'milk_production REAL', 'weight REAL')
btn = Button(root, text = "Input cow's data", command = lambda : cows.insert_data(dicto, entries))
btn.place(x = 905, y = 350)
поэтому, когда я нажимаю кнопку, значения, введенные в записях cow_id, lactation_phase, milk_production и weight, должны быть вставлены в созданную мной таблицу, но вместо этого вставленные значения пустые, поэтому каждый раз, когда я нажимаю кнопку, создается пустая запись, и я понятия не имею, почему это происходит.
Вот весь код:
import sqlite3
from tkinter import *
x = 0
root = Tk()
cow_id = Entry(root, width = 30)
cow_id.place(x= 340, y= 300 )
lactation_phase = Entry(root, width = 30)
lactation_phase.place(x = 525, y= 300)
milk_production = Entry(root, width = 30)
milk_production.place(x = 710, y = 300)
weight = Entry(root, width = 30)
weight.place(x= 895, y = 300)
cow_id_label = Label(root, text = "Cow Identification Number")
cow_id_label.place(x = 350, y= 270)
lactation_phase_label = Label(root, text= "Lactation phase")
lactation_phase_label.place(x= 545, y = 270)
milk_production_label = Label(root, text = "Milk production")
milk_production_label.place(x = 720, y = 270)
weight_label = Label(root, text = "Weight")
weight_label.place(x = 905, y = 270)
delete_label = Label(root, text = "To delete cow record enter cow ID" )
delete_label.place(x = 475, y = 500)
delete_entry = Entry(root)
delete_entry.place(x= 340, y = 500)
conn = sqlite3.connect("cows.db")
c = conn.cursor()
class databases:
global c
def __init__(self, table_name):
self.table_name = table_name
def insert_structure(self,mydict, table_name):
query = 'INSERT INTO {} VALUES ({}{})'
d = dict(mydict)
y = next(iter(d))
# table = d.pop(y)
columns = ',:'.join(d.keys())
placeholders = ','.join(['{}'] * len(d))
values = d.values()
f = str(query.format(table_name,':', columns, placeholders))
return f
def create_table(self, *args):
c.execute('''CREATE TABLE IF NOT EXISTS {} {} '''.format(self.table_name, args))
conn.commit()
def insert_data(self, dicty, list):
c.execute(self.insert_structure(dicty, self.table_name), dicty)
conn.commit()
for k in list:
k.delete(0, END)
print(dicty)
def delete_record(self, *args):
c.execute('''DELETE FROM {} WHERE {} = {}'''.format(self.table_name, args))
conn.commit()
cows = databases('cow')
dicto = {
'cow_id': cow_id.get(),
'lactation_phase': lactation_phase.get(),
'milk_production': milk_production.get(),
'weight': weight.get()
}
entries = [cow_id, lactation_phase, milk_production, weight ]
cows.create_table('cow_id REAL', 'lactation_phase TEXT', 'milk_production REAL', 'weight REAL')
btn = Button(root, text = "Input cow's data", command = lambda : cows.insert_data(dicto, entries))
btn.place(x = 905, y = 350)
#btn2 = Button(root, text = "Delete", command = cows.delete_record)
#btn2.place(x = 670, y = 500 )
root.mainloop()
Комментарии:
1. Что вы сделали для отладки этого? Например, вы убедились, что значения непосредственно перед вставкой соответствуют вашим ожиданиям?
2. Я сделал, и значения не такие, какими я их ожидал (это пустые строки). Entry.get () не возвращает пользовательский ввод, и я не знаю, почему это
3. Тогда вы, вероятно, можете удалить весь sql-код из вопроса, поскольку проблема не в sql, а скорее в коде, который подготавливает данные.
4. Я не могу сказать, имеет ли это какое-либо отношение к вашей проблеме, но
def insert_data(self, dicty, list):
~ вам определенно не следует называть свой списокlist
.