반응형
파일에서 읽은 문자열을 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
반응형
'MySql' 카테고리의 다른 글
MySQL MS ACCESS DB를 mySql로 가져 오시겠습니까? (0) | 2021.01.13 |
---|---|
MySQL mysqli로 총 행 수를 얻는 방법 (0) | 2021.01.13 |
MySQL How to match an ip address in mysql? (0) | 2021.01.13 |
MySQL 텍스트 상자를 보이지 않거나 읽기 전용으로 만들기 (0) | 2021.01.13 |
MySQL mysql 테이블의 필드 수 가져 오기 (0) | 2021.01.13 |
댓글