scribble

ottocho's blog

Home About GitHub

06 Dec 2013
Python MySQLdb prepared statement

Python MySQLdb prepared statement

前言

有应该会极其常用的东西,值得分享下,所以这里说下。

在 python 的 MySQLdb 里,经常可以看到大家会这样写 SQL 的操作:

sql = ' insert into table_name(field1, field2, field3, field4, field5) values(%d, "%s", "%s", "%s", "%s"); '
      % ( 1, 'field2_value', 'field3_value', 'field4_value', 'field5_value' )
cursor.execute(sql)

实际上,python MySQLdb 的 cursor.execute 有一定程度的 prepared statement(也就是上面那些格式化的字符串SQL工作),cursor.execute 接受多参数的调用,使用 cursor.execute 的时候,并不需要把 SQL 完全拼接完成调用函数。

cursor.execute

官方的关于 cursor 文档是这样说的:

execute(self, query, args=None)
Execute a query.

query -- string, query to execute on server
args -- optional sequence or mapping, parameters to use with query.

Note: If args is a sequence, then %s must be used as the
parameter placeholder in the query. If a mapping is used,
%(key)s must be used as the placeholder.

cursor.execute 调用参数情况如下:

sequence

sql = 'insert into orders(name, email, address) values(%s, %s, %s)'
params = ('ottocho', 'ot@q.com', 'tx')
cursor.execute(sql, params)

如上,在 sql 字符串中(一个 SQL 模版),所有需要填的域写为 %s ,execute 的第二个参数为一个顺序排列的域内容。此时 所有 %s 的字符串格式化工作,由 execute 内部实现(这个是 MySQLdb.converters 的工作);

dict

sql = 'insert into orders(name, email, address) values(%(name)s, %(email)s, %(address)s)'
params = dict(name="ottocho", email='ot@q.com', address='tx')
cursor.execute(sql, params)

和上面类似,在 SQL 模版中,以 %(field_name)s 的形式标识了需要填入内容的地方,params 参数使用的是一个字典,其 key 即为数据表域名。dict 类型的调用好处是更易读,但是代码会略长点。

这样的好处是使得代码更好读好写好维护。

长 SQL 格式化

另外,SQL 很长的时候,用 ''' xxx ''' 的形式,会使得 SQL 更好读一些,如下:

sql = '''
        select service_groupid, service_group_name, service_group_desc,
               def_devtype, import_level, need_eth0, productid,
               enable_monitor, dev_principal1, dev_principal2,
               oss_principal1, oss_principal2, test_principal1, test_principal2
        from service_group_info
        where productid in (5,10,11) order by 1
      '''

提这个的原因是,太多人一行代码里写了几百个字符了。

后序

ottozhuo

2013.12.06


Til next time,
at 22:12

scribble

Home About GitHub