2015-10-16 47 views
1

SQLite3请求不起作用我创建了一个python脚本来创建一个带有一个表的sqlite3数据库。该表由2列组成:一个用于id(int),另一个用于关联的句子(文本)。下面是代码:
由于'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文件中执行'\'来保护这个字符,但它不起作用。
问题是我需要在我的句子中保留'。我不是一个Python程序员,所以我的知识非常有限。你有任何想法使这个脚本工作?

+6

_DO不连接的数据到查询;使用查询参数!_'cur.execute(“INSERT INTO ... VALUES(?,?)”,(i,line))' –

+1

否则有人可能会给你一个关于他们的儿子Bobby的句子。 –

+0

扩大Chads评论:[妈妈的漏洞](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代替进行更有效的for循环:

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

谢谢你的答案,我知道这是危险的,但这个脚本只是在这里帮助我创建数据库。除我以外,其他人都不会访问它。 – Mtoypc

+0

@MoPypc好吧,它不仅安全,而且查询适用于任何'line'文本值,不像简单地连接它。更何况,如果你使用'executemany',那么查询参数是必需的,如果你插入大量的行,这是性能所需要的。 –