Python如何在没有%s的情况下进行字符串替换?

时间:2012-08-03 19:19:43

标签: python sql string

查看我发现的以下几行Python 2.6代码:

key = 'hire_date' 
update_dict['key'] = update_dict[key]     #added e.g. {..., 'key': '12/31/1999'}
if key == 'hire_date':
     query_string = "UPDATE employee SET " + key + "= CAST(%(key)s AS DATE) WHERE emp_id = '" + emp.employee + "'"

我已经测试了这段代码,但它确实有效。它成功地将数据库中员工的hire_date字段更新为字典中'key'值的任何日期。

当我注意到%(key)s以某种方式设法获得'key'字典的值时,我正在参数化它。它是如何做到的?我一直认为你必须在字符串之后添加% dictionaryOrTupleOrWhatever才能使用它。

2 个答案:

答案 0 :(得分:3)

在您粘贴的代码中,不会进行插值。但是,稍后可以插入变量:

>>> x = "%(var)s" # no interpolation yet
>>> d = {'var': 88}
>>> x % d # interpolate into the stored string
'88'

鉴于您发布的代码看起来像SQL,它也可以稍后通过SQL库调用进行插值。许多SQL接口库使用%符号提供类似的字符串替换,并鼓励用户使用这些而不是内置字符串替换,因为SQL库版本具有各种安全措施来防止恶意注入攻击。

答案 1 :(得分:2)

我打赌你会在代码中稍后发现有一个DB execute语句,它将update_dict作为参数。然后,DB API执行替换而不是Python字符串格式化,从而正确处理绑定。

看看这个:http://furius.ca/pubcode/pub/antiorm/lib/python/dbapiext.html#escaping-in-the-dbapi-2-0