2012-06-22 8 views
1

저는 csv 파일을 구문 분석하고 MySQL 테이블에 대한 입력을 생성하는 스크립트 작업을하고 있습니다.Python MySQL INSERT from csv

모든 데이터가 csv.reader를 통해 가져 오므로 모든 행은 문자열 목록입니다. 행을 반복하고 데이터베이스에 다른 항목을 넣고 싶습니다.

나는 다음과 같은 시험 작동시킬 수 있습니다

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (1, 'entry1', 'entry2');" 
cursor.execute (sql) 

그래서 내 SQL 연결 작품과 원칙 SQL 구문은 괜찮습니다. 나는 거기에 넣고 싶은 항목에 액세스 할 수 있으며, 내가 원하는 데이터 유형과 정확합니다.

allData = csv.reader(open('TestTable.csv', 'rb'), delimiter=',', quotechar='|') 
for row in allData: 
    sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (row[0], row[1], row[2]);" 
    cursor.execute (sql) 

이것은 구문 오류 발생 :

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to our MySQL server version for the right syntax to use near '[0], row[1], row[2])' at line 1 

그러나 데이터 유형이 올바른지 및 그러나, 나는 반복 내에서 변수와 같은 SQL 구문을 사용할 수 있도록하지 않는 것 SQL 문법은 작업 예제와 동일합니다 ...

누구나 내가 잘못하고있는 것과 어떻게 작동시키는 지 말해 줄 수 있습니까?

는 (결국, 난 그냥 MySQL의 대량 가져 오기를 사용하지 않는 이유입니다,뿐만 아니라 순수한 CSV 항목뿐만 아니라 파생 된 값을 삽입 할.) 당신의 도움에 미리

감사합니다! Lastalda

답변

3

사용 :

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (?, ?, ?);" 
cursor.execute (sql, (row[0], row[1], row[2])) 

와 Questionmark이 자리 표시 자입니다. 자리 표시자를 사용하는 또 다른 이점은 qoutes 등을 이스케이프 처리하여 자동으로 입력을 '안전'하게 만드는 것입니다.
지금은 을 "row [0], row [1] 행 [2] ", 파이썬 대신 이러한 변수의 값을 사용하도록 지시합니다. 또한


, 여러 길이의 행을 사용하려는, 또는 쉽게 입력 목록의 크기를 변경 할 수 있도록하려면, 당신은 동적으로 자리 표시자를 만들 수있는 경우 :

sql = "INSERT INTO testSmall VALUES (%s);" % ', '.join('?' for _ in row) 
cursor.execute (sql, row) 
+0

아! 고마워, 그건 의미가있어! – Lastalda

+0

멋진 코드 조각! 왜 "문자열 형식을 변환하는 동안 모든 인수가 변환되지 않습니까?" : – Pitto

2

을 당신이 그것을하는 방식으로, row[n] 변수를 참조하지 않는 row,하지만 그들은 MySQL로 보내진 문자열의 조각입니다. (나는 PHP 배경에서 왔고 큰 따옴표로 변수를 값으로 대체 할 것을 기대한다.)

당신은 문자열 (문자열) 내부의 값을 삽입하기 위해이 작업을 수행 할 수

: (행 [0] abc 경우, 해당 문자열이되지 않습니다 때문에이주의 작동하지 않습니다

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (%s, %s, %s);" % row # will map each %s to the `n`th element in `row` 

따옴표로 묶여 있으므로 MySQL은이를 문자열로 해석하지 않습니다). SQL 변수를 출력 해보고 mysql 프롬프트에 복사하여 붙여 넣기하면 작동 여부를 확인할 수 있습니다.MySQL과 연동하여 사용하는 경우

그러나, 당신은 더 나은과 같이, 이러한 탈출 :

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (%s, %s, %s);" 
    cursor.execute(sql, row) 

을 당신은 the docs에서 자세한 내용을보실 수 있습니다.

+0

설명해 주셔서 감사합니다. 지금은 이해가됩니다! (실제로 저는 프로그래밍에 피가 묻은 초보자이며 파이썬은 제 1 언어입니다. PHP 배경은 전혀 없으며, 제 뇌는 일어나지 않을 것으로 예상합니다.) – Lastalda

+0

Ok 그렇다면 PHP로 프로그래밍 된 두뇌가 있습니다. 도움이 되니 기쁩니다. – jadkik94