添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在Python和sqlite中的转义字符

54 人关注

我有一个Python脚本,可以将原始电影文本文件读入一个sqlite数据库。

我使用re.escape(title)在字符串中添加转义字符,以便在执行插入之前使其成为db安全的字符串。

Why does this not work:

In [16]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'")
--------------------------------------------------------------------------- OperationalError                       Traceback (most recent call last)
/home/rajat/Dropbox/amdb/<ipython console> in <module>()
OperationalError: near "Allo": syntax error

但这是有效的(在两个地方删除了'')。

In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]: <sqlite3.Cursor object at 0x9666e90>

我搞不清楚。我也不能抛弃那些领先的引号,因为它们实际上是电影名称的一部分。

python
sqlite
rajat banerjee
rajat banerjee
发布于 2010-07-11
4 个回答
Donal Fellows
Donal Fellows
发布于 2016-08-10
已采纳
0 人赞同

你做错了。从字面上讲。你应该使用参数,像这样。

c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)"))

像这样,你将不需要做任何 quoting at all and (if those values are coming from 任何one untrusted) you'll be 100% safe (here) from SQL injection attacks too.

绝对的。引号和转义是最后的资源缺陷。如果参数可用,就使用它们。 始终
顺便说一下,同样的想法也适用于几乎所有其他值得一提的数据库,以及几乎所有其他实用的编程语言。 Everyone 这样做是因为它是 right .
太棒了,谢谢多纳尔。现在一切运作良好。我在RoR中使用了类似的方法,那里有很好的文档。但是,搜索 "Python sqlite转义字符 "几个小时后,什么也没找到,Python文档还有很多不足之处。谢谢Donal和大家
Kos
注意,这些参数只对值起作用。例如,它们对列名不起作用。引述可能是一种笨拙的做法,但有时仍然是必要的。
如果你的数据库接口将用户提供的名字作为表或列的标识符来传递,这通常说明有很大的问题。(或者你正在做一个真正的专家级的接口,在这种情况下,你很可能不是在做普通的数据库代码!)
Alex Martelli
Alex Martelli
发布于 2016-08-10
0 人赞同

我使用re.escape(title)将转义字符添加到字符串中,使其成为数据库中的数据。 字符添加到字符串中,使其成为DB

请注意, re.escape 使一个字符串 re -安全 -- 与制作无关 db 安全。 相反,正如@Donal所说,你需要的是 参数替换 Python DB API的概念 -- 使事情按你的需要 "db安全"。

dan04
dan04
发布于 2016-08-10
0 人赞同

SQLite不支持反斜杠转义序列。 字符串中的撇号用加倍的方式表示。 '''Allo ''Allo! (1982)'

但是,就像Donal说的,你应该使用参数。

Clock ZHONG
Clock ZHONG
发布于 2016-08-10
0 人赞同

我有一个简单的提示,你可以用来处理这个问题。 当你的SQL语句串有单引号:'时,你可以用双引号来包围你的语句串。而当你的SQL语句串有双引号:"时,你可以用单引号:"来括住你的语句串。 举例来说。

sqlString="UPDATE movies SET rating = '8.7' WHERE name='Allo Allo !' (1982 )"
c.execute(sqlString)