-
따옴표 또는 쌍따옴표가 포함된 문자열을 DB API로 적재하기Tips 2023. 10. 24. 18:50728x90반응형
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반응형'Tips' 카테고리의 다른 글
SQL로 문자열에서 특정 문자를 다른 문자로 레코드 변경하기 (0) 2023.11.02 Redshift에서의 where ... in과 inner join 성능 비교 (0) 2023.10.30 colab에서 mecab 설치 실패시 해결 방법 (error: subprocess-exited-with-error) (0) 2023.08.24 눈으로 보기에 같은 글자이지만 다른 글자로 인식되는 경우에는 아스키코드를 뽑아보자 (0) 2023.06.12 Javascript에서 서버 시간대에 상관없이 한국 시간으로 현재 날짜 호출하기 (0) 2023.05.16