Python/MySQL - 将 MySQL 数据导出到 excel
Python/MySQL - Export MySQL data to excel
我想创建一个函数,通过单击一个按钮将数据从我的 MySQL 表之一导出到 excel (csv)。与银行的连接工作正常,图形界面也是如此,但是当我点击按钮时,会导致以下错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\TESTES\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "C:/Users/TESTES/PycharmProjects/Heiken/A_FUNCTIONS_CADASTRO/Excel.py", line 25, in exp_rel_con_pag
cursor.execute(statm)
File "C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\cursors.py", line 170, in execute
result = self._query(query)
File "C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\cursors.py", line 328, in _query
conn.query(q)
File "C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\connections.py", line 516, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\connections.py", line 750, in _execute_command
raise err.InterfaceError("(0, '')")
pymysql.err.InterfaceError: (0, '')
代码如下:
import pymysql
from tkinter import *
excel = Tk()
excel.geometry("")
excel.title("excel teste")
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
print("connect successfull!")
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
versao = cursor.fetchone()
print("Versão do gerenciador Maria DB: %s" % versao)
conn.close()
def exp_rel_con_pag():
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TMP/OMNIACADEMP.CSV' FIELDS TERMINATED BY ',' ENCLOSED BY "" LINES TERMINATED BY '\n'"
cursor.execute(statm)
bt = Button(excel, width=15, text="run", command=exp_rel_con_pag)
bt.place(x=10, y=10)
excel.mainloop()
连接已断开。如您所见 in the code for PyMySQL,当没有连接到服务器 (if not self._sock
) 时会返回该错误。
您需要为 conn
对象创建一个 cursor
。当您获得 MariaDB 版本时,它正在重用旧的 cursor
对象。
import pymysql
from tkinter import *
excel = Tk()
excel.geometry("")
excel.title("excel teste")
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
print("connect successfull!")
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
versao = cursor.fetchone()
print("Versão do gerenciador Maria DB: %s" % versao)
conn.close()
def exp_rel_con_pag():
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
cursor = conn.cursor()
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TMP/OMNIACADEMP.CSV' FIELDS TERMINATED BY ',' ENCLOSED BY "" LINES TERMINATED BY '\n'"
cursor.execute(statm)
bt = Button(excel, width=15, text="run", command=exp_rel_con_pag)
bt.place(x=10, y=10)
excel.mainloop()
1st 我会使用 with conn:
而不是 conn
和 close()
。您未能关闭您的第二个连接,with
方法将为您关闭它。
2 你需要 close/recreate 你的光标。这就是问题。您可以在第一次连接中在 conn.close()
之前执行 cursor.close()
或使用 with cursor:
代替。您的函数正在尝试使用已关闭的第一个连接中的原始游标,这就是它失败的原因。
综上所述,如果您关闭连接然后打开一个新连接并分配一个新游标,您不会 "Need" 关闭游标,您不应该 运行 遇到任何问题。然而,我会争辩说,一旦不再使用光标就关闭它是一种很好的做法。我还没有 运行 遇到游标问题,但安全总比抱歉好,因为我猜 close()
方法存在于 cursor
是有原因的。
试试这个,如果您有任何问题,请告诉我:
import tkinter as tk
import pymysql
root = tk.Tk()
root.geometry("")
root.title("excel teste")
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
with conn:
print("connect successfull!")
cursor = conn.cursor()
with cursor:
cursor.execute("SELECT VERSION()")
versao = cursor.fetchone()
print("Versão do gerenciador Maria DB: %s" % versao)
def exp_rel_con_pag():
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
with conn:
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TMP/OMNIACADEMP.CSV' FIELDS TERMINATED BY ',' ENCLOSED BY "" LINES TERMINATED BY '\n'"
cursor = conn.cursor()
with cursor:
cursor.execute(statm)
results = cursor.fetchone()
print(results)
tk.Button(root, width=15, text="run", command=exp_rel_con_pag).place(x=10, y=10)
root.mainloop()
我想创建一个函数,通过单击一个按钮将数据从我的 MySQL 表之一导出到 excel (csv)。与银行的连接工作正常,图形界面也是如此,但是当我点击按钮时,会导致以下错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\TESTES\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "C:/Users/TESTES/PycharmProjects/Heiken/A_FUNCTIONS_CADASTRO/Excel.py", line 25, in exp_rel_con_pag
cursor.execute(statm)
File "C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\cursors.py", line 170, in execute
result = self._query(query)
File "C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\cursors.py", line 328, in _query
conn.query(q)
File "C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\connections.py", line 516, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\connections.py", line 750, in _execute_command
raise err.InterfaceError("(0, '')")
pymysql.err.InterfaceError: (0, '')
代码如下:
import pymysql
from tkinter import *
excel = Tk()
excel.geometry("")
excel.title("excel teste")
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
print("connect successfull!")
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
versao = cursor.fetchone()
print("Versão do gerenciador Maria DB: %s" % versao)
conn.close()
def exp_rel_con_pag():
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TMP/OMNIACADEMP.CSV' FIELDS TERMINATED BY ',' ENCLOSED BY "" LINES TERMINATED BY '\n'"
cursor.execute(statm)
bt = Button(excel, width=15, text="run", command=exp_rel_con_pag)
bt.place(x=10, y=10)
excel.mainloop()
连接已断开。如您所见 in the code for PyMySQL,当没有连接到服务器 (if not self._sock
) 时会返回该错误。
您需要为 conn
对象创建一个 cursor
。当您获得 MariaDB 版本时,它正在重用旧的 cursor
对象。
import pymysql
from tkinter import *
excel = Tk()
excel.geometry("")
excel.title("excel teste")
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
print("connect successfull!")
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
versao = cursor.fetchone()
print("Versão do gerenciador Maria DB: %s" % versao)
conn.close()
def exp_rel_con_pag():
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
cursor = conn.cursor()
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TMP/OMNIACADEMP.CSV' FIELDS TERMINATED BY ',' ENCLOSED BY "" LINES TERMINATED BY '\n'"
cursor.execute(statm)
bt = Button(excel, width=15, text="run", command=exp_rel_con_pag)
bt.place(x=10, y=10)
excel.mainloop()
1st 我会使用 with conn:
而不是 conn
和 close()
。您未能关闭您的第二个连接,with
方法将为您关闭它。
2 你需要 close/recreate 你的光标。这就是问题。您可以在第一次连接中在 conn.close()
之前执行 cursor.close()
或使用 with cursor:
代替。您的函数正在尝试使用已关闭的第一个连接中的原始游标,这就是它失败的原因。
综上所述,如果您关闭连接然后打开一个新连接并分配一个新游标,您不会 "Need" 关闭游标,您不应该 运行 遇到任何问题。然而,我会争辩说,一旦不再使用光标就关闭它是一种很好的做法。我还没有 运行 遇到游标问题,但安全总比抱歉好,因为我猜 close()
方法存在于 cursor
是有原因的。
试试这个,如果您有任何问题,请告诉我:
import tkinter as tk
import pymysql
root = tk.Tk()
root.geometry("")
root.title("excel teste")
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
with conn:
print("connect successfull!")
cursor = conn.cursor()
with cursor:
cursor.execute("SELECT VERSION()")
versao = cursor.fetchone()
print("Versão do gerenciador Maria DB: %s" % versao)
def exp_rel_con_pag():
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", database="omnia")
with conn:
statm = "SELECT * FROM omniacademp INTO OUTFILE '/TMP/OMNIACADEMP.CSV' FIELDS TERMINATED BY ',' ENCLOSED BY "" LINES TERMINATED BY '\n'"
cursor = conn.cursor()
with cursor:
cursor.execute(statm)
results = cursor.fetchone()
print(results)
tk.Button(root, width=15, text="run", command=exp_rel_con_pag).place(x=10, y=10)
root.mainloop()