2016-10-27 2 views
1

내가 pyodbc를 통해이 개 MySQL의 연결이 선언 한대로 : 나는 CSV를 만들pyodbc.Error : ('HY000은', '드라이버는 오류를 제공하지 않았다!')

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

팬더 같은 연결을 caling로 이것은 :

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

그럼 내가 미리으로 (제 1 번째 함수를 호출하는 경우, 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() 

업로드이 함수를 호출 pyodbc.Error : ('HY000', '드라이버가 오류를 제공하지 못했습니다!')

모두 가져 오기 기능을 사용하면 첫 번째 기능을 호출하면 데이터를 완벽하게 업로드합니다. 임이 잘못한 것의 암시? 감사합니다.

답변

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

이 방법으로 당신이 항상 문 '과'당신은 항상 연결이 끊어집니다 사용할 때 각 작업에 대해

+0

두 번째 해결 방법을 찾으러 갔다. 사용하려고하는 모든 함수에 대해 conection을 선언하는 하나의 파일을 사용하고 있었고 CSV를 작성하는 함수 만 호출 할 때 다른 함수를 호출하면 구입시 오류가 발생했다. 업로드 ii. 당신의 솔루션은 훌륭하게 작동했습니다! 고맙습니다. – Alejandro

+0

문제 없습니다. 도와 줄 수있어서 기뻐. –

+0

이 답변은 절대적으로 도움이되지만,'pyodbc'보다는 MySQL 드라이버를 사용하는 방법을 고려할 수도 있습니다. – FlipperPA