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

DevMon·2024년 9월 27일
import mysql.connector
from faker import Faker
import random # 파이선 기본 모듈

# 1) mysql 연결 설정
db_connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='dudgus724',
    database='testdatabase'
)
뎅
# 2) mysql 연결
cursor = db_connection.cursor()
faker = Faker()
print(db_connection)

# users 데이터 생성
for _ in range(100): # _ 는 굳이 사용하진 않고 100번 반복할거다.
    username = faker.user_name()
    email = faker.email()

    sql = "INSERT INTO users(username, email) VALUES(%s, %s)", (username, email)
    cursor.execute(sql)

db_connection.commit()
cursor.close()

python의 Random과 Faker 모듈을 사용해 데이터를 생성하고 mysql과 연동한 뒤 데이터를 insert 하는 상황.

db와의 연동이 잘 되었는지 까지는 확인했고, 코드에는 딱히 오타나 문제가 없었다.

에러 메세지를 보니 excute() 메서드의 호출 중에 문제가 생긴 것이 맞는 것 같은데, 'tuple' 타입 개체에 '인코드' 속성이 없다?

이해할 수 없어서 바로 구글링...

검색 결과 *DB SQL 인젝션 공격(웹 애플리케이션과 데이터베이스 간의 연동에서 생기는 취약점으로, 공격자가 입력폼에 악의적으로 조작된 쿼리를 삽입하여 데이터베이스 정보를 불법적으로 열람하거나 조작하는 것.) 을 방지하기 위해 직접 문자열에 데이터를 동적으로 코드하는 것은 지양해야 한다고 나와있었다.

따라서 코드를 수정해보면...

코드를 import mysql.connector
from faker import Faker
import random # 파이선 기본 모듈

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

# 2) mysql 연결
cursor = db_connection.cursor()
faker = Faker()
print(db_connection)

# users 데이터 생성
for _ in range(100): # _ 는 굳이 사용하진 않고 100번 반복할거다.
    username = faker.user_name()
    email = faker.email()

    sql = "INSERT INTO users(username, email) VALUES(%s, %s)"
    param = (username, email)
   
    cursor.execute(sql, param)

db_connection.commit()
cursor.close()입력하세요

위와 같이 excute()를 호출할 때, 동적 할당 대상이 되는 쿼리와 동적 할당 하려는 데이터를 따로 두어 호출을 해야한다.

profile
기술 블로그

0개의 댓글