2011-03-16 3 views
9

executemany를 사용하여 데이터베이스에 값을 삽입하려했지만 나에게 적합하지 않습니다.파이썬의 executemany를 sqlite3이 제대로 작동하도록 할 수 없습니다.

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied. 그러나

나는 목록을 변경하면, 그것은 잘 작동 :

clist = ["a", "b"] 
cursor.executemany("INSERT INTO myTable(data) values (?) ", clist) 

그것은으로 작동

clist = [] 
clist.append("abc") 
clist.append("def") 
clist.append("ghi") 
cursor.executemany("INSERT INTO myTable(data) values (?) ", clist) 

이 나에게 다음과 같은 오류를 제공합니다 : 다음은 샘플입니다 예상했다! 데이터베이스의 데이터를 볼 수 있습니다. 첫 번째 목록이 작동하지 않고 두 번째 목록이 작동하는 이유는 무엇입니까?

(추신 : 이것은 실제 코드가 아닌 샘플입니다. 간단히하기 위해 작은 테스트 케이스를 만들었습니다.)

내가 executemany 알고있는 것과

답변

12

, 당신은 의미

clist = [("abc",), ("def",), ("ghi",)] 
cursor.executemany("INSERT INTO myTable(data) values(?)", clist) 

또는 이와 유사한. sqlite에 대한 구문을 인용하지 마십시오. 잠시 동안 앱에서 사용하지는 않았지만 튜플 (iterable) (일반적으로 iterables)이 필요합니다.

그것은 당신이지고있는 오류처럼 보이는

은 당신이 제공하고 각 문자열을 반복하려고한다는 것입니다, 그래서 당신의 문은 같은 작품 : 나는 당신의 두 번째 쿼리가 무엇인지 모르는

clist = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')] 

성취하려고 시도하지만 다른 테이블을 처리하는 것처럼 보이므로 스키마 정보가없는 것으로 추측하고 있지만 단일 문자 스트링을 다중 문자 스트링으로 변경하면 실패하게됩니다.

+0

둘 다 동일한 테이블이었습니다. 오타가 나쁘다. 이제 문제가 해결되었습니다. 그 안에 하나의 필드가있는 간단한 테이블. – brainydexter

+0

그래 ... 아직 두 질문에 모두 답변했습니다 ... – marr75

+0

두 번째 클리스트에 대한 의견을 다시 올릴 수 있습니까? 내 대답을 게시 한 사람이 그것을 삭제하고 그 사람과 함께 갔다고 생각합니다. – brainydexter

5

그냥 문맥을 보완 : 한 번에 하나 개의 튜플을하기 위해

res = [("John", "2j4o1h2n"), ("Paula", "lsohvoeemsy"), ("Ben", "l8ers")] 

cur.executemany("INSERT INTO users (user, password) VALUES (?)", res) 

기대 SQLite는 : 밀접하게 관련이 상황에서 내가 같은 executemany을 사용하여 테이블에 폴리 튜플의리스트를 삽입하는 의미 (따라서 단일? 값 필드 파라미터 교체) 및 SQLite는 별도로 VALUES (...) 필드 속성 치환 기대한다로서 (<username>, <password>이 경우에는) 그 캡슐의 속성으로하여 분열, 그것뿐만 아니라 sqlite3.ProgrammingError 예외 The current statement uses 1, and there are 2 supplied.로 실패 . 그래서 그것을 해결

cur.executemany("INSERT INTO users (user, password) VALUES (?, ?)", res) 

이 조금 혼동 수있는 사소한 경우지만 이다, 나는 그것이 붙어있어 누구든지 도움이 될 수 있기를 바랍니다.