查看我发现的以下几行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
才能使用它。
答案 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