Tips
따옴표 또는 쌍따옴표가 포함된 문자열을 DB API로 적재하기
Hyunie
2023. 10. 24. 18:50
728x90
반응형
python에서는 문자열을 표현하는 기호로 쌍따옴표(")와 따옴표(')를 모두 사용하므로, 문자열 안에 쌍따옴표나 따옴표가 포함될 경우 알아서 escape 기호(\)를 사용하거나 문자열 표현자를 쌍따옴표 또는 따옴표를 선택해서 사용함으로써 인식한다.
하지만 SQL에서 쌍따옴표는 컬럼명을 의미하므로, 문자열에는 ' 만 사용할 수 있고, 문자열 내부에 '가 포함되는 경우 escape 기호를 사용해서 넣으면 된다.
부딪힌 상황은 외부 api를 사용해 받은 응답값을 DB에 저장하는데 해당 응답 문자열에 ' 또는 "가 포함되는 경우가 있었고,(예시 - "이름은 'abc'입니다.") 해당 문자열을 executeone 함수로 insert했을 때 syntax error가 발생했다.
해결 방법은 두 가지가 있는데, 첫 번째는 문자열 내부에 있는 ' 또는 "를 아스키 코드로 바꿔서 넣는 방법이다. 이 방법을 사용하면 쿼리에 들어가는 문장은 다음과 같다 (쿼리는 redshift 기준이다).
def quotes_to_ascii(st):
return "' || CHR(39) || '".join("' || CHR(39) || '".join(st.split('"')).split("'"))
st = quotes_to_ascii(st)
cur.execute(f"insert into {table_name} ({column_name}) values ('{st}')")
conn.commit()
원 문장: 이름은 'abc'입니다.
쿼리: insert into ... values('이름은' || chr(39) || 'abc' || chr(39) || '입니다')
두 번째 해결책은 execute시 파라미터를 사용하는 방법이다.
query = f"insert into {table_name} ({column_name}) values (?)"
cur.execute(query, (st,))
conn.commit()
728x90
반응형