3

我有一个小脚本可以为我创建一个特定的 INSERT SQL 语句。

对于 postgresql,我需要将要插入的值包含在两个单引号内。

不幸的是,一些要插入的值字符串也包含一个单引号,我需要自动转义它们。

for line in f:
    out.write('(\'' + line[:2] + '\', \'' + line[3:-1] + '\'),\n')

如何确保内部的任何单引号(例如 ' )line[3:-1]自动转义?

谢谢,

更新:

例如这条线

CI|Cote D'ivoire

由于失败'

更新 2:

我不能在值中使用双引号,例如

INSERT INTO "App_country" (country_code, country_name) VALUES ("AF", "Afghanistan")

我收到错误消息:ERROR: column "AF" does not exist

但是,这可以正常工作:

INSERT INTO "App_country" (country_code, country_name) VALUES ('AF', 'Afghanistan')

4

5 回答 5

3

PEP-249中所述,DBPI 是各种数据库的通用接口。不同的数据库存在不同的实现。对于 postgres 有psycopg。来自文档:

cur.execute(
...     """INSERT INTO some_table (an_int, a_date, a_string)
...         VALUES (%s, %s, %s);""",
...     (10, datetime.date(2005, 11, 18), "O'Reilly"))

您只需在元组中传递参数。底层库为您转义它。这比尝试自己动手更安全、更容易。

于 2012-07-06T23:40:43.003 回答
2

转义引号的 SQL 标准方法是将其加倍:

'This won''t be a problem.'

因此,用两个引号替换每个引号(并在 Python 中使用双引号以保持理智):

out.write("('" + line[:2] + "', '" + line[3:-1].replace("'", "''") + "'),\n")
于 2012-07-07T00:04:13.333 回答
2

永远不要为 DML 使用生成的、自己滚动的转义。使用 Keith 提到的适当的 DBAPI。为了确保从各种来源的逃逸和类型转换几乎可以透明地发生,我们会进行工作。如果您使用的是 DDL,例如CREATE TABLE whatever (...)- 如果您信任自己的数据源,您可能会更加松懈。

使用示例中显示的数据

import sqlite3

text = "CI|Cote D'ivoire" # had to been escaped as it's a string literal, but from another data source - possibly not...

code, name = text.split('|', 1)

db = sqlite3.connect(':memory:')
db.execute('create table something(code, name)')
db.execute('insert into something(code, name) values(?, ?)', (code, name))

for row in db.execute('select * from something'):
    print row
# (u'CI', u"Cote D'ivoire")
于 2012-07-07T00:32:09.193 回答
1

对于将转义字符添加到字符串的完整解决方案,请使用:

re.escape(string)
>>> re.escape('\ a.*$')
'\\\\\\ a\\.\\*\\$'

有关更多信息,请参阅:http ://docs.python.org/library/re.html

于 2012-07-06T22:59:55.910 回答
0

不确定是否存在一些与 SQL 相关的限制,但您始终可以使用双引号将包含单引号的字符串括起来。

例如。

print "That's all Folks!"

或单引号包围双引号:

print 'The name of the file is "rosebud".'
于 2012-07-06T22:47:17.957 回答