我有两个通过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()
我创建一个带有pandas的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','驱动程序没有提供错误!')
我做错了什么提示? 谢谢!
答案 0 :(得分:3)
在调用它之后,第一个函数创建的连接可能仍处于活动状态。您没有关闭该连接,因此光标仍然处于活动状态。
您不需要两个连接。理想情况下,您应该打开连接,执行操作,然后关闭连接。
尝试这样的事情:
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()
这样,只要你总是使用''声明,您将始终为每个操作连接和断开连接。