Python & SQLite에서 'sqlite3.ProgrammingError: Incorrect number of bindings supplied' 오류 해결하기
"python", "sqlite"와 관련된 "sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 74 supplied" 오류 해설
Python 코드에서 SQLite3를 사용하여 데이터베이스 작업을 수행하는 동안 다음과 같은 오류가 발생합니다.
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 74 supplied
오류 해석
이 오류는 SQL 문장에 제공된 바인딩 개수가 실제로 필요한 개수와 일치하지 않음을 나타냅니다. 즉, SQL 문장에서 사용하는 플레이스홀더 개수와 실제로 제공된 값 개수가 다릅니다.
예시
다음 예를 살펴보겠습니다.
import sqlite3
connection = sqlite3.connect('database.db')
cursor = connection.cursor()
sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)"
values = ("John Doe", "[email protected]", 30)
cursor.execute(sql, values)
connection.commit()
connection.close()
위 코드에서 sql
문장은 세 개의 플레이스홀더를 사용합니다. 하지만 values
튜플에는 세 개의 값만 제공됩니다. 따라서 다음과 같은 오류가 발생합니다.
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 3, and there are 3 supplied
해결 방법
오류를 해결하려면 SQL 문장에 사용된 플레이스홀더 개수와 실제로 제공된 값 개수를 일치시켜야 합니다.
SQL 문장 확인
먼저 SQL 문장을 확인하여 사용된 플레이스홀더 개수를 확인합니다.
값 확인
다음으로 SQL 문장에 제공된 값을 확인합니다. 값 개수가 플레이스홀더 개수와 일치하는지 확인합니다.
값 추가 또는 제거
필요한 경우 값을 추가하거나 제거하여 플레이스홀더 개수와 값 개수를 일치시킵니다.
코드 테스트
변경 사항을 적용한 후 코드를 다시 테스트하여 오류가 해결되었는지 확인합니다.
import sqlite3
connection = sqlite3.connect('database.db')
cursor = connection.cursor()
# 테이블 생성 (예시)
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
);
""")
# 데이터 삽입 (오류 예시)
try:
cursor.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", ("John Doe", "[email protected]"))
except sqlite3.ProgrammingError as e:
print(f"오류: {e}")
# 데이터 삽입 (정상 예시)
cursor.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", ("John Doe", "[email protected]", 30))
# 데이터 커밋 및 연결 종료
connection.commit()
connection.close()
위 코드는 다음과 같은 작업을 수행합니다.
database.db
라는 이름의 SQLite 데이터베이스에 연결합니다.users
라는 이름의 테이블을 만듭니다. 이 테이블에는id
,name
,email
,age
라는 네 개의 열이 있습니다.John Doe
라는 이름,[email protected]
라는 이메일 주소, 30세라는 나이를 가진 사용자를users
테이블에 삽입하려고 시도합니다. (이 부분에서 오류가 발생합니다.)- 데이터베이스 변경 사항을 커밋합니다.
- 데이터베이스 연결을 종료합니다.
위 코드에서 발생하는 오류는 INSERT
문장에 제공된 값 개수가 테이블의 열 개수와 일치하지 않기 때문입니다. 테이블 users
에는 4개의 열이 있지만 INSERT
문장에는 3개의 값만 제공됩니다.
이 오류를 해결하려면 다음과 같이 코드를 수정해야 합니다.
cursor.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", ("John Doe", "[email protected]", 30))
수정된 코드는 age
열에 대한 값을 추가하여 테이블의 열 개수와 제공된 값 개수를 일치시킵니다.
추가 예시
다음은 데이터 삽입, 업데이트 및 삭제를 위한 코드 예시입니다.
데이터 삽입
cursor.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", ("Jane Doe", "[email protected]", 25))
데이터 업데이트
cursor.execute("UPDATE users SET age = 31 WHERE name = 'John Doe'")
데이터 삭제
cursor.execute("DELETE FROM users WHERE email = '[email protected]'")
"sqlite3.ProgrammingError: Incorrect number of bindings supplied" 오류를 해결하는 대체 방법
"sqlite3.ProgrammingError: Incorrect number of bindings supplied" 오류는 Python에서 SQLite3를 사용할 때 SQL 문장에 제공된 바인딩 개수가 실제로 필요한 개수와 일치하지 않을 때 발생합니다.
기본 해결 방법
이전 답변에서 설명한 대로 이 오류를 해결하는 기본적인 방법은 SQL 문장에 사용된 플레이스홀더 개수와 실제로 제공된 값 개수를 일치시키는 것입니다.
대체 방법
하지만 상황에 따라 다음과 같은 대체 방법을 사용할 수도 있습니다.
문자열 포매팅 사용
SQL 문장을 문자열 포매팅으로 작성하여 플레이스홀더를 직접 만들 수 있습니다. 다음은 예시입니다.
import sqlite3
connection = sqlite3.connect('database.db')
cursor = connection.cursor()
name = "John Doe"
email = "[email protected]"
age = 30
sql = f"INSERT INTO users (name, email, age) VALUES ('{name}', '{email}', {age})"
cursor.execute(sql)
connection.commit()
connection.close()
namedtuple 사용
namedtuple
모듈을 사용하여 SQL 문장에 제공할 값을 그룹화할 수 있습니다. 다음은 예시입니다.
import sqlite3
from collections import namedtuple
connection = sqlite3.connect('database.db')
cursor = connection.cursor()
User = namedtuple('User', ['name', 'email', 'age'])
user = User(name="John Doe", email="[email protected]", age=30)
sql = "INSERT INTO users VALUES (:name, :email, :age)"
cursor.execute(sql, user._asdict())
connection.commit()
connection.close()
SQLAlchemy 사용
SQLAlchemy는 Python에서 데이터베이스 작업을 수행하기 위한 더욱 강력하고 객체 지향적인 라이브러리입니다. SQLAlchemy는 바인딩 오류를 방지하는 데 도움이 되는 여러 기능을 제공합니다. 다음은 예시입니다.
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///database.db')
Session = sessionmaker(bind=engine)
session = Session()
user = User(name="John Doe", email="[email protected]", age=30)
session.add(user)
session.commit()
session.close()
python sqlite