繁体   English   中英

pyodbc.Error:('HY000','驱动程序未提供错误!')

[英]pyodbc.Error: ('HY000', 'The driver did not supply an error!')

我有两个通过pyodbc的Mysql连接,声明为:

connMy1 = pyodbc.connect('DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=***;UID=***;PWD=***')
connMy1.autocommit = True
cursorMy1 = connMy1.cursor()

connMy2 = pyodbc.connect('DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=***;UID=***;PWD=***')
connMy2.autocommit = True
cursorMy2 = connMy2.cursor()

我用大熊猫创建了一个CSV来对连接进行校准,如下所示:

def bajar(sql,tabla,ruta):
    print ("bajando datos")
    chunk = 10 ** 5 
    chunks = pandas.read_sql(sql, connMy1, chunksize=chunk)
    eliminarArchivo(ruta)
    print ("creando CSV")
    with open(ruta, 'w') as output:
        for n, df in enumerate(chunks):
            write_header = n == 0
            df.to_csv(output, sep=';', index=False, header=False, na_rep='NULL')
    connMy1.commit()   

然后我调用此函数上传CSV

def subir(ruta,tabla):
    print ("Subiendo datos")
    sqlMy2 = "load data local infile '"+ruta+"' into table "+tabla+" fields terminated by ';' lines terminated by '\r\n';"
    print (sqlMy2)
    cursorMy2.execute(sqlMy2)
    connMy2.commit()

如果我首先调用第二个函数(第一个函数使用预先创建的CSV格式),则会完美地上传数据,如果我在第一个函数之后调用该函数,则会得到:pyodbc.Error:('HY000','驱动程序未提供一个错误!')

我在做什么错的任何暗示吗? 谢谢!

调用后,第一个函数创建的连接可能仍处于活动状态。 您没有关闭该连接,因此光标将仍然处于活动状态。

您不需要两个连接。 理想情况下,您应该打开连接,执行操作,然后关闭连接。

尝试这样的事情:

def bajar(sql,tabla,ruta):
    connMy1 = pyodbc.connect('DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=***;UID=***;PWD=***')
    connMy1.autocommit = True
    cursorMy1 = connMy1.cursor()
    print ("bajando datos")
    chunk = 10 ** 5 
    chunks = pandas.read_sql(sql, connMy1, chunksize=chunk)
    eliminarArchivo(ruta)
    print ("creando CSV")
    with open(ruta, 'w') as output:
        for n, df in enumerate(chunks):
            write_header = n == 0
            df.to_csv(output, sep=';', index=False, header=False, na_rep='NULL')
    connMy1.commit()  
    connMy1.close()

def subir(ruta,tabla):
    connMy1 = pyodbc.connect('DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=***;UID=***;PWD=***')
    connMy1.autocommit = True
    cursorMy1 = connMy1.cursor()
    print ("Subiendo datos")
    sqlMy2 = "load data local infile '"+ruta+"' into table "+tabla+" fields terminated by ';' lines terminated by '\r\n';"
    print (sqlMy2)
    cursorMy1.execute(sqlMy2)
    connMy1.commit()
    connMy1.close()

这仍然不是理想的,我建议创建一个类来处理您的SQL连接。 这样的事情会更好:

class MySQL:
    def __init__(self):
        self.conn = None

    def __enter__(self):
        self.conn = pyodbc.connect('DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=***;UID=***;PWD=***')
        self.conn.autocommit = True

    def __exit__(self, *args):
        if self.conn:
            self.conn.close()
            self.conn = None

然后可以这样调用:

def bajar(sql,tabla,ruta):
    mysql = MySQL()
    with mysql:
        print ("bajando datos")
        chunk = 10 ** 5 
        chunks = pandas.read_sql(sql, mysql.conn, chunksize=chunk)
        eliminarArchivo(ruta)
        print ("creando CSV")
        with open(ruta, 'w') as output:
            for n, df in enumerate(chunks):
                write_header = n == 0
                df.to_csv(output, sep=';', index=False, header=False, na_rep='NULL')
        mysql.conn.commit()


def subir(ruta,tabla):
    mysql = MySQL()
    with mysql:
        print ("Subiendo datos")
        sqlMy2 = "load data local infile '"+ruta+"' into table "+tabla+" fields terminated by ';' lines terminated by '\r\n';"
        print (sqlMy2)
        mysql.conn.cursor().execute(sqlMy2)
        mysql.conn.commit()

这样,只要您始终使用“ with”语句,就将始终为每个操作连接和断开连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM