如何逃避'在一个字符串内?

时间:2012-07-06 22:46:13

标签: python sql

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

对于postgresql,我需要将值插入两个单引号中。

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

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

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

谢谢,

更新

e.g。这条线

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')

5 个答案:

答案 0 :(得分:2)

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"))

您可以在元组中简单地传递参数。底层库为您逃脱了它。这比试图自己滚动更安全,更容易。

答案 1 :(得分:2)

逃避引用的SQL标准方法是将其加倍:

'This won''t be a problem.'

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

out.write("('" + line[:2] + "', '" + line[3:-1].replace("'", "''") + "'),\n")

答案 2 :(得分: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")

答案 3 :(得分:1)

要获得将字符串转义为字符串的完整解决方案,请使用:

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

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

答案 4 :(得分:0)

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

EG。

print "That's all Folks!"

或单引号括起双引号:

print 'The name of the file is "rosebud".'