【问题标题】:Python and SQL - inserting and reading valuesPython 和 SQL - 插入和读取值
【发布时间】:2016-08-19 11:26:19
【问题描述】:

我的代码有问题。我正在制作一个窗口应用程序。现在,我需要将数据插入到数据库中的表中,然后显示给我(使用 SELECT)。我有 2 个字段来输入用户的名称和密码(ID 是根据表中的条目数计算的)和一个按钮来触发输入。然后我有一个字段,我希望在插入后显示确认信息,以及一个从表中触发“SELECT”的按钮。该应用程序确实启动了,但据我所知,它不会将其添加到表中(并且不会显示任何确认信息)。这是我的代码:

from tkinter import *
import sqlite3 as lite
import sys
from Crypto.Cipher import AES

con = None
con = lite.connect('test.db')
cur = con.cursor() 


class Application(Frame):
    def __init__(self, master):
        super(Application, self).__init__(master)  
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        self.inst_lbl = Label(self, text = "Dodaj uzytkownika")
        self.inst_lbl.grid(row = 0, column = 0, columnspan = 2, sticky = W)

        self.pwa = Label(self, text = "Login")
        self.pwa.grid(row = 1, column = 0, sticky = W)

        self.pwb = Label(self, text = "Haslo")
        self.pwb.grid(row = 2, column = 0, sticky = W)


        self.a = Entry(self)
        self.a.grid(row = 1, column = 1, sticky = W)
        self.b = Entry(self)
        self.b.grid(row = 2, column = 1, sticky = W)




        self.submit_bttn = Button(self, text = "Dodaj uzytkownika", command = self.dodaj)
        self.submit_bttn.grid(row = 3, column = 0, sticky = W)

        self.secret_txt = Text(self, width = 35, height = 5, wrap = WORD)
        self.secret_txt.grid(row = 4, column = 0, columnspan = 2, sticky = W)

        self.view_users = Button(self, text = "Wyswietl uzytkownikow", command = self.wyswietl)
        self.view_users.grid(row = 10, column = 0, sticky = W)

        self.users_window = Text(self, width = 35, height = 5, wrap = WORD)
        self.users_window.grid(row = 11, column = 0, columnspan = 2, sticky = W)

    def dodaj(self):
        a = self.a.get()
        b = self.b.get()
        index = cur.execute("SELECT COUNT(Id) FROM users")
        cur.execute("INSERT INTO users (Id, Nazwa, Haslo) VALUES(?,?,?)", (int(index),str(a),str(b)))
        #obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
        #ciphertext = obj.encrypt(test)
        self.secret_txt.delete(0.0, END)
        self.secret_txt.insert(0.0, (index, a, b))
    def wyswietl(self):
        viewall = cur.execute("SELECT * FROM users")
        self.users_window.delete(0.0, END)
        self.users_window.insert(0.0, viewall)



root = Tk()
root.title("ShopQIP")
root.geometry("1024x700")
#root.mainloop()

app = Application(root)

root.mainloop()

当我尝试查看表的内容时,我在该字段中收到错误:
sqlite3.Cursor object at 0x02A6E220

此外,代码运行,但运行时出现此错误:
*Tkinter 回调中的异常
回溯(最近一次通话最后一次):
调用中的文件“C:\Users\kjubus\AppData\Local\Programs\Python\Python35-32\lib\tkinter__init__.py”,第 1549 行 return self.func(args)
文件“C:\Users\kjubus\Dysk Google!Szkoła\MGR\Projekt inzynierski\inzynierka v0.1.py”,第 52 行,在 dodaj
cur.execute("INSERT INTO users (Id, Nazwa,Haslo) VALUES(?,?,?)", (int(index),str(a),str(b)))
TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是 'sqlite3.Cursor'

只是为了澄清 - 在这部分“第 1549 行”调用之前和之后 call 有 2 个下划线。

【问题讨论】:

    标签: python sql sqlite window


    【解决方案1】:

    __call__ 是用于调用对象和函数的内部方法。你可以忽略它。

    游标的execute 方法通常会返回一些无害的值,例如受影响的行数,并且通过单独调用其fetch* 方法之一来返回结果。所以你可能需要类似的东西

        cur.execute("SELECT COUNT(Id) FROM users")
        index = cur.fetchone()[0] # First (and only) element in the single row
        cur.execute("INSERT INTO users (Id, Nazwa, Haslo) VALUES(?,?,?)", (int(index),str(a),str(b)))
    

    【讨论】:

    • 它现在似乎可以工作(它在该字段中显示“确认”数据),但它似乎对 test.db 文件没有任何影响。此外,第二部分(查看所有条目)仍然不起作用
    • 这可能是因为您没有调用创建游标的数据库连接的commit 方法。这是使更改永久化所必需的
    • 是的,我刚刚添加了 con.commit() 并且它有效。但我无法让“选择”部分工作。有什么想法吗?
    • 这是同样的问题 - 您假设 execute 返回查询结果,但事实并非如此。将viewall = cur.execute("SELECT * FROM users") 替换为cur.execute("SELECT * FROM users"),然后插入一行viewall = cur.fetchall()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多