2014-02-27 3 views
0

파이썬 스크립트를 사용하여 csv 파일을 MySQL 데이터베이스로 가져 오려고합니다. 자동으로 실패하는 것 같습니다.Python : MySQLdb LOAD DATA INFILE가 자동으로 실패 함

#!/usr/bin/python 

import MySQLdb 

class DB: 
    host = 'localhost' 
    user = 'root' 
    password = '**************' 
    sqldb = 'agriculture' 
    conn = None 

    def connect(self): 
     self.conn = MySQLdb.connect(self.host,self.user,self.password,self.sqldb) 

    def query(self, sql, params=None): 
     try: 
      cursor = self.conn.cursor() 
      if params is not None: 
       cursor.execute(sql, params) 
      else: 
       cursor.execute(sql) 
     except (AttributeError, MySQLdb.OperationalError): 
      self.connect() 
      cursor = self.conn.cursor() 
      if params is not None: 
       cursor.execute(sql, params) 
      else: 
       cursor.execute(sql) 

     print vars(cursor) 
     return cursor 

    def load_data_infile(self, f, table, options=""): 
     sql="""LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY ',';""" % (f,table) 
     self.query(sql) 


db = DB() 

pathToFile = "/home/ariggi/722140-93805-sqltest.csv" 
table_name = "agriculture.degreedays" 

db.load_data_infile(pathToFile, table_name) 

나는 "쿼리()"메소드 내 화면에 커서 오브젝트를 덤프하고이 상황을 디버깅하기위한 시도 :

여기 내 코드입니다. 여기에서의 출력은 :

{ '_result'없음 '설명'없음 'ROWNUMBER'0 '메시지'[] 가 '_executed' "로드 DATA LOCAL INFILE 를 '/ ',', 'rowcount': 500L, 'connection': 'description_flags': 없음, ' 0 ','lastrowid ': 0L,'_last_executed ': "LOAD DATA LOCAL INFILE'/ home/ariggi/722140-93805 : 배열 크기 : 1, '_info': '레코드 : 500 삭제됨 : 0 건너 뛴 : 0 경고 : -sqltest.csv 'INTO TABLE agriculture.degreedays 필드 종료', ';', '_ 경고': 0, '_rows':()}

01 23,516,

나는

LOAD DATA LOCAL INFILE '/home/ariggi/722140-93805-sqltest.csv' INTO TABLE agriculture.degreedays FIELDS TERMINATED BY ','; 

이며 예상 행이 테이블을 채 웁니다대로 작동 MySQL의 콘솔을 통해 그것을 실행 "_last_executed"쿼리를 취합니다. 그러나이 스크립트를 실행하면 데이터베이스 테이블이 비어 있습니다.

나는 꽤 난처하고 약간 도움을 사용할 수 있었다.

답변

3

변경 내용을 영구히 적용하려면 코드 끝에 db.conn.commit()을 호출 해보십시오. 파이썬은 기본적으로 "autocommit"모드를 사용하지 않으므로 커밋을 발행 할 때까지 DB 모듈은 변경 사항을 불완전한 트랜잭션의 일부로 간주합니다. 나는이 자동으로 변경 사항을 적용하기 때문에 제어 코드를 제기하지 않는 한 올바른 제제는

with conn.cursor() as curs: 
    do_something_with(curs) 

이었다라고 말하고 싶지만하지만 -

으로 @AirThomas은 우리에게 "컨텍스트 관리자"를하는 데 도움이 코멘트에 지적 예외.

+0

그랬습니다. 감사! 나는 커밋 선언문없이 일찍 작업했기 때문에 지금은 더 혼란 스럽다. 커밋없이 2 개의 쿼리를 실행하면 두 번째 쿼리가 첫 번째 쿼리를 커밋합니까? –

+3

@Mike'with conn as cursor :'를 사용하면 모듈은'with' 블록 내부에서 사용할 커서를 제공하고 블록을 종료 할 때 커밋합니다. – Air

+0

큰 제안! 나는 당신이 내 대답에 그것을 (자연스럽게 신용으로) 포함시키는 것을 꺼리지 않기를 바란다. – holdenweb