代码之家  ›  专栏  ›  技术社区  ›  user3802409

异步函数中的PyMySql查询

  •  1
  • user3802409  · 技术社区  · 7 年前

    我正在使用 tornado 框架来编写非阻塞API。

    我想进行异步mysql查询,为此,我应该使用异步mysql库(用于tornado)还是可以使用类似的东西?

    import tornado.web
    import pymysql
    import json
    
    
    class AsyncDBCalls(tornado.web.RequestHandler):
        def initialize(self):
            database = {
                "host": "localhost",
                "user": "root",
                "password": "123456",
                "db": "tableName",
                "cursorclass": pymysql.cursors.DictCursor,
                "autocommit": True,
                "charset": "utf8"
            }
            try:
                self.db_connection = pymysql.connect(**database)
                self.db = self.db_connection.cursor()
            except pymysql.err.OperationalError:
                pass
                # TODO logging
    
        async def make_query(self, query):
            self.db.execute(query)
            results = self.db.fetchall()
            return results
    
        @tornado.web.asynchronous
        async def get(self):
            query = "SELECT * FROM users"
            results = await self.make_query(query)
            self.set_status(200)
            self.add_header("Content-Type", "text/json")
            self.write(json.dumps(results))
            self.finish()
    

    是这个吗 make\u查询 函数异步运行?这段代码可以用于非阻塞API吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   desertkun    7 年前

    使用 TorMySQL 相反

    self.pool = tormysql.ConnectionPool(
            max_connections=256,
            wait_connection_timeout=5,
            idle_seconds=7200,
            host=<host>,
            db=<database>,
            user=<user>,
            passwd=<password>,
            cursorclass=tormysql.cursor.DictCursor,
            autocommit=True,
            use_unicode=True,
            charset="utf8",
            **kwargs
        )
    
    connection = yield self.pool.Connection()
    ...
    # this actually will not close the connection, but put back into pool
    connection.close()
    

    你可以偷这个 gist . 它将为您处理游泳池。有了它,您可以:

    db.query("SELECT ..");
    

    对于原子操作,或者从池中获取连接以获取更复杂的内容:

    with (yield db.acquire(auto_commit=False)) as db:
        row = yield db.get("SELECT ... FOR UPDATE");
        ...
        yield db.execute("UPDATE ...");
        yield db.commit()