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: 而不是 connclose()。您未能关闭您的第二个连接,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()