개발성문/python

sqlite3 - 바인딩 에러

개발성문 2023. 7. 26. 10:40

데이터 베이스 테이블에 이름을 insert 하기위해 작성한 코드이다.

sql = "INSERT INTO companies (name) VALUES (?)"

cursor.execute(sql, ("kyc"))
connection.commit()

cursor.execute(sql, ("kyc")) 부분에서 
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied

에러가 발생함.

 

번역하자면,

"제공된 바인딩의 수가 잘못되었습니다. 현재 문장은 1개를 사용하고, 제공된 바인딩은 3개입니다." 라는 뜻.

 

SQL 쿼리에서 필요한 매개변수의 수와 제공된 매개변수의 수가 일치하지 않을 때 발생하는 에러로

"바인딩"이란, SQL 쿼리에서 사용하는 매개변수 (위 코드에서의 "?")에 대입되는 값을 의미함.

 

정리하자면,  SQL 쿼리에서 필요로하는 바인딩(파라미터)의 수와 제공된 바인딩의 수가 맞지 않다는 것을 알려주는 것이고. SQL 문장은 하나의 매개변수만 요구하지만 제공된 바인딩이 세 개("k", "y", "c")라는 것이 문제라는 것인데!!!!!!

 

난 분명 "kyc" 라는 하나의 문자열을 제공했는데, 제공된 바인딩을 세 개("k", "y", "c")로 인식했다는 것이다.

문제는 문자열 "kyc"를 튜플로 만들기 위해 괄호를 사용했지만, 쉼표를 넣지 않았기 때문.

즉, ("kyc")는 실제로는 튜플이 아닌 문자열 "kyc"로 인식되는 것.

 

그런데, SQLite 파라미터로 문자열이 아닌 튜플을 기대하기 때문에,

이 문자열 "kyc"를 튜플로 간주하려고 시도하고 각 문자를 별도의 튜플 요소로 해석버림.

 

따라서 "kyc"가 "k", "y", "c"로 나누어져 3개의 요소를 가진 튜플로 간주되었던 것.

 

sql = "INSERT INTO companies (name) VALUES (?)"

cursor.execute(sql, ("kyc",))
connection.commit()

문자열 하나를 요소로 하는 튜플을 만들려면 쉼표를 넣어야 함. 기초에서 배움 ㅠㅠ

("kyc",). 이렇게 하면 "kyc" 문자열이 튜플의 단일 요소로 간주됨.