【发布时间】:2012-02-29 09:08:05
【问题描述】:
我注意到大多数消息来源都说在 Python 中执行 SQL 语句的最佳实践是这样的:
cursor.execute( 'select * from coworkers where name = :1 and clue > :2', [ name, clue_threshold ] )
其他消息来源说
cursor.execute( "select * from coworkers where name = %s and clue > %s", ( name, clue_threshold ) )
我觉得很相似。
无论如何,我一直在做的是创建字典和存储值。例如,初始字典 biz_info 如下所示:
biz_info = {
'business' : None,
'name' : None,
'neighborhood' : None,
'address' : None,
'city' : None,
'state' : None,
'zip_code' : None,
'latitude' : None,
'longitude' : None,
'phone' : None,
'url' : None,
'yelp_url' : None,
}
然后我像这样执行SQL语句
execute_sql( cur, "insert into " + TABLE_BIZ_NAME + """ values (
NULL,
%(name)s,
%(neighborhood)s,
%(address)s,
%(city)s,
%(state)s,
%(zip_code)s,
%(latitude)s,
%(longitude)s,
%(phone)s,
%(url)s,
%(yelp_url)s,
NULL
)"""
, biz_info )
这对 sql 注入安全吗?我想使用字典来存储信息,因为它更易于管理。
说实话,我什至不完全确定在参数化查询中使用 %、,、%s、%d 和 %()s 之间的区别是什么。基本上我所知道的是不使用
cursor.execute( "select * from coworkers where name = '%s' and clue > %d" % ( name, clue_threshold ) )
【问题讨论】:
-
“这对 sql 注入安全吗?”。是的。 “我什至不完全确定在参数化查询中使用 %、,、%s、%d 和 %()s 之间的区别是什么”。这是否意味着您在询问 Python DB-API 的规则?你在问这个python.org/dev/peps/pep-0249吗?
标签: python mysql mysql-python