运行 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> 这显然是不正确的。您需要深入了解 stu、re1 和 at 被设置为空字符串。
【讨论】:
我有一个名为 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 的模块”