【问题标题】:Python/MySQL - Export MySQL data to excelPython/MySQL - 将 MySQL 数据导出到 Excel
【发布时间】:2019-12-17 18:56:43
【问题描述】:

我想创建一个函数,通过单击按钮将数据从我的一个 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()

【问题讨论】:

    标签: python mysql excel tkinter export-to-csv


    【解决方案1】:

    第一个我会使用with conn: 而不是使用conn 和close()。您未能关闭第二个连接,with 方法将为您关闭它。

    第二个你需要关闭/重新创建你的光标。这就是问题。您可以在第一次连接中在conn.close() 之前执行cursor.close(),或者改用with cursor:。您的函数正在尝试使用已关闭的第一个连接中的原始光标,这就是它失败的原因。

    如果您关闭连接然后打开一个新连接并分配一个新光标,那么您不需要“需要”关闭光标,您应该不会遇到任何问题。但是,我会争辩说,一旦不再使用光标,将其关闭是一种好习惯。我还没有遇到光标问题,但比抱歉更安全,因为我的猜测是 cursor 存在 close() 方法是有原因的。

    试试这个,如果您有任何问题,请告诉我:

    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()
    

    【讨论】:

    • 显然它现在给我的唯一错误是语法之一: pymysql.err.ProgrammingError: (1064, "您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册在第 1 行的 'LINES TERMINATED BY '\n'' 附近使用正确的语法")
    • @gdn 这是您的 sql 语句的问题。您可能不应该尝试从 select 语句写入 CSV 文件。而是获取结果,然后使用这些结果使用 openpyxl 之类的方式写入 CSV。
    • 最后我做到了,谢谢你的帮助。非常感谢你。您现在只是发出警告,但会生成报告。
    • @gdn 我通常将pyodbc 用于我的SQL 连接,所以我不确定您会收到什么样的警告,因为我不使用pymysql。
    • 这个:C:\Users\TESTES\PycharmProjects\Heiken\venv\lib\site-packages\pymysql\cursors.py:170: Warning: (1287, "'<select expression> INTO <destination>;' is deprecated and will be removed in a future release. Please use 'SELECT <select list> INTO <destination> FROM...' instead") result = self._query(query)
    【解决方案2】:

    连接已死。如您所见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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2013-03-19
      • 2020-05-15
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多