2015-10-16 2 views
1

Я создал скрипт python для создания базы данных sqlite3 с одной таблицей. Эта таблица состоит из 2 столбцов: одна для id (int), а другая для связанного предложения (текста). Вот код:
SQLite3 запрос не работает из-за 'character

#!/usr/bin/python 

import sqlite3 

i=0 
con = sqlite3.connect("database.db") 
cur = con.cursor() 
cur.execute('''CREATE TABLE data(data_id int, sentence text)''') 

with open("data.txt", "r") as ins: 
     for line in ins: 
     i = i + 1 
     cur.execute("insert into data(data_id, sentence) values ("+str(i)+",'"+line+"')") 

con.commit() 
con.close() 

Как вы можете видеть, этот код будет читать файл data.txt, который представляет собой файл, который содержит предложения по каждой строке.

Когда я пытаюсь выполнить сценарий, я получаю эту ошибку:

Traceback (most recent call last): 
    File "scriptData.py", line 13, in <module> 
    cur.execute("insert into data(data_id, sentence) values ("+str(i)+",'"+line+"')") 
sqlite3.OperationalError: near "che": syntax error 

Это связано с тем, что в моем файле data.txt, некоторые строки имеют "характер, который является проблемой. Я попытался защитить этого персонажа, выполнив его в файле data.txt, но это не сработало.
Проблема в том, что мне нужно держать «в моих предложениях». Я не программист на питоне, поэтому мои знания очень ограничены. Есть ли у вас идея заставить этот скрипт работать?

+6

_DO не конкатенации данных в запросах; используйте параметры запроса! _ cur.execute («INSERT INTO ... VALUES (?,?)», (i, line)) ' –

+1

В противном случае кто-то может дать вам предложение об их сыне Бобби .. –

+0

Чтобы расширить комментарий Chads : [Exploits of a mom] (https://xkcd.com/327/) – Matthias

ответ

4

Вы должны использовать бежать, чтобы предотвратить такую ​​ситуацию, когда вы передаете Params на запросы SQL:

cur.execute("insert into data(data_id, sentence) values (?, ?)", (i, line)) 
+1

Я никогда не запомню, поддерживает ли sqlite форматирование '% s' - более традиционно использовать'? ' –

+0

@JonClements, спасибо. –

+0

Я получаю сообщение об ошибке: sqlite3.OperationalError: рядом с "%": синтаксическая ошибка. – Mtoypc

3

Не конкатенации данных в запросах SQL. Это опасно; злоумышленники могут выполнять атаки SQL-инъекций. Вместо этого используйте параметры запроса.

cur.execute("insert into data(data_id, sentence) values (?, ?)", (i, line)) 

отметить также, что запрос может быть сделан более эффективным с помощью executemany вместо цикл:

cur.execute("insert into data(data_id, sentence) values (?, ?)", enumerate(ins)) 
+0

Спасибо за ответ, я знаю, что это опасно, но этот скрипт здесь, чтобы помочь мне создать базу данных. Никто, кроме меня, не получит доступ к нему. – Mtoypc

+0

@Mtoypc Ну, это не только безопасно, но запрос будет работать для любого текстового значения 'line', в отличие от просто конкатенации. Не говоря уже о том, что параметры запроса требуются, если вы используете 'executemany', что необходимо для производительности, если вы вставляете большое количество строк. –

Смежные вопросы