Jost Do It.

그냥 IT해.

Programming/Python

[sqlalchemy] immutabledict is not a sequence 에러 해결

그냥하Jo. 2024. 3. 9. 01:26
반응형

문제 상황

sqlalchemy 라이브러리를 통해서 엔진을 생성하고 SQL문을 실행했더니 다음 에러가 발생했다.

[...]

TypeError: sqlalchemy.cyextension.immutabledict.immutabledict is not a sequence

 

 

실행한 코드는 다음과 같다.

from sqlalchemy import create_engine

conn_str = "{DB_TYPE}://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}".format(**os.environ)
engine = create_engine(conn_str, client_encoding='utf8')

del_sql = "DELETE FROM test"
where = ('%', "'확률을 의미합니다.'")
sql = f"{del_sql} WHERE (이름, 설명) IN (where)"

with self.engine.begin() as conn:
	conn.exec_driver_sql(del_sql)

 

 

 

 

문제 원인

문자열 escaping 처리를 하지 않아서 발생하였다.

파이썬에서 데이터베이스 이용과 관련한 문서에서 paramstyle이라는 항목을 볼 수 있다.

paramstyle은 DB에 입력할 SQL문 내에 변수를 생성하고, SQL 실행 시 값들을 넣어 실행을 가능케 한다.

 

% 문자 자체를 SQL에 입력하려면 이스케이프 처리를 해야한다. 그렇지 않으면 paramstyle 형식으로 인식하기 때문에 SQL 처리시 에러가 발생하는 것이다.

다음으로 sql에서 string 값은 작은 따옴표(')로 감싸주는데, string 안에 따옴표가 있는 경우, '를 앞에 붙여서 escaping을 해줘야 한다.

 

해결 방법

SQL을 실행하기 전에 where  변수에서 escaping 처리를 해준다.

where = (val.replace("'", "''").replace('%', '%%') for val in where)

 

 

Reference

반응형