[에러 해결] AttributeError: 'tuple' object has no attribute 'encode'

Byungchan Park·2024년 2월 12일

에러 해결

목록 보기
1/1

에러 메세지

위 에러 메세지에서 유심히 봐야 할 문장은 바로 맨 아랫줄에 있습니다.
AttributeError: 'tuple' object has no attribute 'encode'

에러 대상 코드

import mysql.connector
from faker import Faker

# MySQL 연결 설정
db_connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='',
    database='testdatabase'
)

# MySQL 연결
# 연결한 DB와 상호작용하기 위해 cursor 객체 생성
cursor = db_connection.cursor()
faker = Faker()

# users 테이블에 데이터 삽입
for _ in range(100): # 100개 데이터 삽입
    username = faker.user_name()
    email = faker.email()
    
    insert_query = "INSERT INTO users(username, email) VALUES (%s, %s)", (username, email)

    cursor.execute(insert_query)

db_connection.commit()
cursor.close()
db_connection.close()

위 에러는 insert_query 변수에 저장된 튜플(동적 할당 대상이 되는 쿼리, 동적 할당하려는 데이터)을 cursor.execute 메서드의 파라미터로 넣어 호출하는 과정에서 발생했습니다.

에러 해결

위 에러를 해결하는 과정에서 Django 공식 문서(https://docs.djangoproject.com/en/1.11/topics/db/sql/)를 확인했는데요.
DB SQL 인젝션 공격을 방지하기 위해서는 위의 코드처럼 직접적으로 문자열에 데이터를 동적으로 할당하는 것은 지양해야 한다고 합니다.
따라서 cursor.execute 메서드의 파라미터로 튜플(동적 할당 대상이 되는 쿼리, 동적 할당하려는 데이터)을 넣어 호출하는 대신 동적 할당 대상이 되는 쿼리와 동적 할당하려는 데이터를 각각 별개로 두어 cursor.execute 메서드 에 각각 차례대로 넣어 호출합니다.

import mysql.connector
from faker import Faker

# MySQL 연결 설정
db_connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='',
    database='testdatabase'
)

# MySQL 연결
cursor = db_connection.cursor()
faker = Faker()

# users 테이블에 데이터 삽입
for _ in range(100): # 100개 데이터 삽입
    username = faker.user_name()
    email = faker.email()
    
    insert_query = "INSERT INTO users(username, email) VALUES (%s, %s)"
    insert_param = (username, email)

    cursor.execute(insert_query, insert_param)

db_connection.commit()
cursor.close()
db_connection.close()
profile
풀 스택 개발자를 지향하는 개발자 새내기입니다.

0개의 댓글