Select
要执行SELECT语句,我们用 select 函数执行,需要传入SQL语句和SQL参数:
@asyncio.coroutine
def select(sql, args, size=None):
log(sql, args)
global pool
with (yield from pool) as conn:
cur = yield from conn.cursor(aiomysql.DictCursor)
yield from cur.execute(sql.replace('?', '%s'), args or ())
if size:
rs = yield from cur.fetchmany(size)
else:
rs = yield from cur.fetchall()
yield from cur.close()
logging.info('rows returned: %s' % len(rs))
return rs
SQL语句的占位符是 ? ,而MySQL的占位符是 %s , select() 函数在内部自动替换。注意要始终坚持使用带参数的SQL,而不是自己拼接SQL字符串,这样可以防止SQL注入攻击。
注意到 yield from 将调用一个子协程(也就是在一个协程中调用另一个协程)并直接获得子协程的返回结果。
如果传入 size 参数,就通过 fetchmany() 获取最多指定数量的记录,否则,通过 fetchall() 获取所有记录。