使用TorMysql异步访问mysql
下载地址
https://github.com/snower/TorMySQL
代码
import logging
import traceback
import tormysql
from tormysql import DictCursor
from tornado import gen
from tornado.gen import coroutine
from settings import MYSQL_SETTINGS
class AsyncMysqlClient(object):
def __init__(self):
super(AsyncMysqlClient, self).__init__()
self._db_name = MYSQL_SETTINGS['db']
self._host = MYSQL_SETTINGS['host']
self._port = MYSQL_SETTINGS['port']
self._user_name = MYSQL_SETTINGS['user']
self._password = MYSQL_SETTINGS['passwd']
self._max_conn = MYSQL_SETTINGS['max_conn']
self._conn_time_out = MYSQL_SETTINGS['conn_time_out']
self._db = None
self._client = None
self.pool = tormysql.ConnectionPool(
max_connections=self._max_conn, # max open connections
idle_seconds=7200, # conntion idle timeout time, 0 is not timeout
wait_connection_timeout=self._conn_time_out, # wait connection timeout
host=self._host,
user=self._user_name,
passwd=self._password,
db=self._db_name,
charset="utf8"
)
@coroutine
def query_one(self, sql, args=None):
data = None
with (yield self.pool.Connection()) as conn:
try:
with conn.cursor(cursor_cls=DictCursor) as cursor:
yield cursor.execute(sql, args)
data = cursor.fetchone()
except Exception, e:
logging.error(traceback.print_exc())
logging.error("Query error: %s", e.args)
else:
yield conn.commit()
raise gen.Return(data)
@coroutine
def query_all(self, sql, args=None):
with (yield self.pool.Connection()) as conn:
try:
with conn.cursor(cursor_cls=DictCursor) as cursor:
yield cursor.execute(sql, args)
datas = cursor.fetchall()
except Exception, e:
logging.error(traceback.print_exc())
logging.error("Query error: %s", e.args)
else:
yield conn.commit()
raise gen.Return(datas)
@coroutine
def execute(self, sql, args=None):
with (yield self.pool.Connection()) as conn:
try:
with conn.cursor(cursor_cls=DictCursor) as cursor:
ret = yield cursor.execute(sql, args)
except Exception, e:
logging.error(traceback.print_exc())
logging.error("Query error: %s", e.args)
yield conn.rollback()
else:
yield conn.commit()
raise gen.Return(ret)
@coroutine
def execute_many(self, sql, args=None):
with (yield self.pool.Connection()) as conn:
try:
with conn.cursor(cursor_cls=DictCursor) as cursor:
ret = yield cursor.execute(sql, args)
except Exception, e:
logging.error(traceback.print_exc())
logging.error("Query error: %s", e.args)
yield conn.rollback()
else:
yield conn.commit()
raise gen.Return(ret)
async_mysql_client = AsyncMysqlClient()
注意:
mysql 查询也会开启事物,需要commit();