본문 바로가기
MySql

MySQL 따옴표와 줄 바꿈이있는 문자열을 Python으로 sqlite db에 삽입하는 방법은 무엇입니까?

by 베이스 공부 2021. 1. 13.
반응형

파일에서 읽은 문자열을 Python의 sqlite 데이터베이스에 삽입하려고합니다. 문자열에는 공백 (줄 바꿈, 탭 문자 및 공백)이 있으며 작은 따옴표 또는 큰 따옴표가 표시됩니다. 방법은 다음과 같습니다.

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()

# Create table
c.execute('''CREATE TABLE test
             (a text, b text)''')

f = open("foo", "w")
f.write("hello\n\'world\'\n")
f.close()

testfield = open("foo").read()

# Insert a row of data
c.execute("INSERT INTO test VALUES ('%s', 'bar')" %(testfield))

# Save (commit) the changes
conn.commit()

오류가 발생하여 실패합니다.

    c.execute("INSERT INTO test VALUES ('%s', 'bar')" %(testfield))
sqlite3.OperationalError: near "world": syntax error

이것을 어떻게 달성 할 수 있습니까? db에 삽입하기 전에 문자열을 이스케이프해야합니까? 그렇다면 어떻게해야합니까? 감사.

 

해결 방법

 

문자열 형식화 대신 SQL 매개 변수를 사용합니다.

c.execute("INSERT INTO test VALUES (?, 'bar')", (testfield,))

SQL 매개 변수를 사용할 때 데이터베이스 라이브러리가 인용을 처리하도록하고, 더 나은 방법은 데이터베이스에 쿼리를 최적화하고 동일한 기본 쿼리 (다른 매개 변수 사용)의 여러 실행에 대해 최적화 된 쿼리 계획을 재사용하는 것입니다.

마지막으로, 데이터베이스 라이브러리는 위험한 SQL과 같은 값을 이스케이프하는 방법을 가장 잘 알고 있으므로 SQL 주입 공격으로부터 훨씬 더 잘 방어 할 수 있습니다.



대신 DB-API의 매개 변수 대체를 사용하십시오. 값을 사용하려는 위치에 ? 를 자리 표시 자로 넣은 다음 커서의 execute () 메서드에 대한 두 번째 인수로 값 튜플을 제공합니다.

 

참조 페이지 https://stackoverflow.com/questions/14695134

 

 

반응형

댓글