运行 tkinter+pymysql 脚本时出现 pymysql.err.ProgrammingError

Posted

技术标签:

【中文标题】运行 tkinter+pymysql 脚本时出现 pymysql.err.ProgrammingError【英文标题】:pymysql.err.ProgrammingError when running tkinter+pymysql script 【发布时间】:2018-12-09 12:14:56 【问题描述】:

考虑这段代码:

from tkinter import *
import pymysql

def newc():
    def inr1():

        var1 = var.get()
        connection = pymysql.connect(host='localhost', user='root', password='', db='class')
        cursor = connection.cursor()
        q = ("create table " + str(var1) + "(Name text,regno int,attendence text)")
        cursor.execute(q)
        connection.commit()
        connection.close()

    r2.withdraw()
    r3.deiconify()
    cfr=Frame(r3,width=800,height=600).grid(row=0,column=0)
    l3=Label(cfr,text="Enter the name of the class").grid(row=0,column=0)
    var=StringVar()
    ec=Entry(cfr,textvariable=var).grid(row=0,column=1)
    eb=Button(cfr,text="Create",command=inr1).grid(row=1,column=1)
    eb1=Button(cfr,text="quit",command=quit).grid(row=1,column=2)

def insstud():
    def inr():
        classname =sec.get()
        stu=name.get()
        re1=regno.get()
        at=att.get()
        connection = pymysql.connect(host='localhost', user='root', password='', db='class')
        cursor = connection.cursor()
        q = ("insert into "+str(classname)+" values(%s,%s,%s)")
        values=[stu,re1,at]
        cursor.execute(q,values)
        connection.commit()
        connection.close()

    r2.withdraw()
    s1.deiconify()
    sf = Frame(s1, width=800, height=600).grid(row=0, column=0)
    Label(sf,text="Class").grid(row=0,column=0)
    Entry(sf,textvariable=sec).grid(row=0,column=1)
    Label(sf,text="Name").grid(row=1,column=0)
    Entry(sf, textvariable=name).grid(row=1, column=1)
    Label(sf, text="Regno").grid(row=2, column=0)
    Entry(sf, textvariable=regno).grid(row=2, column=1)
    Label(sf, text="Attendance ").grid(row=3, column=0)
    Entry(sf, textvariable=att).grid(row=3, column=1)
    Button(sf,text="Submit",command=inr).grid(row=4,column=3)
def postlogin():
    root.destroy()
    r2.deiconify()
    nf2=Frame(r2,width=800,height=600).grid(row=0,column=0)
    # /*----For Displaying class---------s-*/
    b1=Button(r2,text="Show the details of a class",command=show).grid(row=0,column=0,rowspan=3,columnspan=3)
    # /*----For creating New class----------*/
    b2=Button(r2,text="Create a new class",command=newc).grid(row=0,column=2,rowspan=3,columnspan=3)
    b3=Button(r2,text="Insert a student into a class",command=insstud).grid(row=1,column=0,rowspan=3,columnspan=3)
    b4=Button(r2,text="Exit",command=quit).grid(row=1,column=2,rowspan=3,columnspan=3)


def sel():
    s1.destroy()
    data1 = []
    sec1=sec.get()
    print(sec1)
    connection = pymysql.connect(host='localhost', user='root', password='', db='class')
    cursor = connection.cursor()
    q = ("select * from " + str(sec1))
    cursor.execute(q)
    data = cursor.fetchall()

    for row in data:

        temp = [row[0], row[1], row[2]]
        data1.append(temp)
    cursor.close()
    connection.close()
    r1 = Tk()
    nf = Frame(r1, width=10, height=10).grid(row=0, column=0)
    l1 = Label(nf, text="Name").grid(row=0, column=0, sticky=W)
    l2 = Label(nf, text="Regno").grid(row=0, column=1, sticky=NW)
    l3 = Label(nf, text="Attendance perc").grid(row=0, column=2, sticky=NW)
    nf1 = Frame(r1, width=200, height=200).grid(row=2, column=2)
    t = Text(nf1)
    for x in range(4):
        t.insert(END, data1[x])
        t.insert(END, "\n")

    t.grid(row=2, column=0)


def show():

    r2.withdraw()

    s1.deiconify()
    sf=Frame(s1,width=100,height=100).grid(row=0,column=0)
    l4=Label(sf,text="Section").grid(row=0,column=0)
    se=Entry(sf,textvariable=sec).grid(row=0,column=1,columnspan=4)
    sb=Button(sf,text="Ok",command=sel).grid(row=1,column=1)



def login():
    usr=user.get()
    pas=password.get()
    connection = pymysql.connect(host='localhost', user='root', password='', db='login')
    cursor = connection.cursor()
    q=("select username from user where username=%s")


    q1 = ("select pass from user where pass=%s")
    if cursor.execute(q,usr) and cursor.execute(q1, pas):
        postlogin()
    else:
        print("Try again")

    connection.commit()
    connection.close()
root=Tk()
user=StringVar()
password=StringVar()
sec=StringVar()
name=StringVar()
regno=StringVar()
att=StringVar()
tp=Frame(root,width=800,height=600)
tp.pack()
l1=Label(tp,text="Username")
l1.grid(row=0,column=0)
e1=Entry(tp,textvariable=user).grid(row=0,column=1,columnspan=4)

l2=Label(tp,text="Password")
l2.grid(row=1,column=0)
e2=Entry(tp,textvariable=password).grid(row=1,column=1,columnspan=4)

submit=Button(tp,text="Login",command=login).grid(row=2,column=2)

#r2 is the windows for post login screen
r2 = Tk()
r2.withdraw()
# r3 is the windows for creating a new class
r3=Tk()
r3.withdraw()
s1=Tk()
s1.withdraw()
root.mainloop()

当我运行它时,我会得到这个回溯:

C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/dimon/PycharmProjects/untitled/1.py
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "C:/Users/dimon/PycharmProjects/untitled/1.py", line 34, in inr
    cursor.execute(q,values)
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\cursors.py", line 170, in execute
    result = self._query(query)
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\cursors.py", line 328, in _query
    conn.query(q)
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\connections.py", line 893, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\connections.py", line 1103, in _read_query_result
    result.read()
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\connections.py", line 1396, in read
    first_packet = self.connection._read_packet()
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\connections.py", line 1059, in _read_packet
    packet.check_error()
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\connections.py", line 384, in check_error
    err.raise_mysql_exception(self._data)
  File "C:\Users\dimon\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'values('','','')' at line 1")

我现在卡住了,有人可以帮忙吗?

【问题讨论】:

欢迎来到堆栈溢出。请以可读的方式添加问题。还可以添加可能的输入和预期输出,以便我们可以轻松调试。 你的问题证明了努力,这是一件好事,但你仍然需要改进它。确保您提供足够的上下文,以便尝试帮助的用户能够重现您的问题......这就是 mcve 的全部意义所在。否则,如果我尝试在我的盒子上运行您的脚本,我是否能够使用您在该问题上提供的信息获得相同的回溯?如果不是,那么它不是 mcve,您需要编辑/改进问题。 @dimonfrekp dimonfrekp 我已经编辑了您的问题,以便让想要试一试但提供的代码仍然不是 mcve 的用户更清楚,例如,如果我尝试运行你的脚本我会得到this 但如果我读到你的问题,我不知道如何得到与你相同的错误。因此,请确保问题将为用户提供足够的信息来重现您的问题中报告的错误 您发布了很多看起来不相关的代码。请尝试将代码缩减为minimal reproducible example。 我有一个名为 login 的数据库,它有一个表 username 和 pass 和另一个名为 class 的数据库,其中包含像 (a,b,c..) 这样的部分表。就像在大学里我们有以 alpha s 命名的部分正确的。)。当我通过运行整个程序运行代码以从特定部分中选择学生时,我得到了上述错误,但是当我运行特定代码时,它没有显示任何错误 【参考方案1】:

好的。我要试一试答案。您的代码依赖于这里没有人可以访问的数据库,因此我们无能为力,但是您遇到的错误是:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'values('','','')' at line 1

这表示 values=[stu,re1,at] 设置为 ['', '', ''] em> 这显然是不正确的。您需要深入了解 sture1at 被设置为空字符串。

【讨论】:

我有一个名为 login 的数据库,它有一个表 username 和 pass 和另一个名为 class 的数据库,其中包含像 (a,b,c..) 这样的部分表。就像在大学里我们有以 alpha s 命名的部分正确的。)。当我通过运行整个程序运行代码以从特定部分中选择学生时,我得到了上述错误,但是当我运行特定代码时,它没有显示任何错误 这是一个 gigo (en.wikipedia.org/wiki/Garbage_in,_garbage_out) 问题。这与代码的特定部分无关,而是与提供给代码的数据有关。在最基本的层面上,对各种变量进行大量打印应该可以帮助您缩小不良数据的来源。

以上是关于运行 tkinter+pymysql 脚本时出现 pymysql.err.ProgrammingError的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过运行 Tkinter 的发送进程在进程之间通过管道发送任何内容时出现管道损坏错误

使用 Pmw 时出现“ImportError:没有名为 tkinter 的模块”

将 cx_freeze 与 tkinter 一起使用时出错

cx_Freeze 没有名为“Tkinter”的模块

关闭控制台时出现 Python Matplotlib 运行时错误

没有找到 tkinter 的匹配分布