Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/MySQL-将MySQL数据导出到excel_Python_Mysql_Excel_Tkinter_Export To Csv - Fatal编程技术网

Python/MySQL-将MySQL数据导出到excel

Python/MySQL-将MySQL数据导出到excel,python,mysql,excel,tkinter,export-to-csv,Python,Mysql,Excel,Tkinter,Export To Csv,我想创建一个函数,通过单击按钮将数据从我的一个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 _

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


连接已断开。如您所见,当没有连接到服务器时会返回该错误(
如果不是self.\u sock

您需要为
conn
对象创建
光标。它正在重用您获得MariaDB版本时的旧
游标
对象

导入pymysql
从tkinter进口*
excel=Tk()
excel.geometry(“”)
excel.title(“excel测试”)
conn=pymysql.connect(host=“localhost”,port=3306,user=“root”,password=“”,database=“omnia”)
打印(“连接成功!”)
游标=连接游标()
cursor.execute(“选择版本()”)
versao=cursor.fetchone()
打印(“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”)
游标=连接游标()
statm=“选择*从OmniAcadempOutfile'/TMP/OmniAcademps.CSV'字段,以“,”结尾,以“\n”结尾的行括起”
cursor.execute(statm)
bt=按钮(excel,宽度=15,text=“run”,命令=exp\u rel\u con\u pag)
位置(x=10,y=10)
excel.mainloop()

1我将使用
连接:
而不是使用
conn
close()
。您无法关闭第二个连接,而
with
方法将为您关闭该连接

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

所有这些都表明,如果您关闭连接,然后打开一个新连接并分配一个新光标,那么您不需要“关闭”光标,您不应该遇到任何问题。然而,我认为,一旦光标不再被使用,关闭它是一种很好的做法。我还没有遇到游标的问题,但总比抱歉好,因为我猜
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()

显然,它现在给我的唯一错误是语法:pymysql.err.ProgrammingError:(1064,“您的SQL语法有错误;请查看与您的MariaDB服务器版本相对应的手册,以了解在“第1行以“\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,“'INTO;'已弃用,将在将来的版本中删除。请改用'SELECT INTO FROM…'”)result=self.\u query(query)