我在网上整理了几个例子,想出了这个。这段代码可以工作,但我想知道是否有更好的方法来做到这一点?
user.py:
from asyncpg import create_pool
from sanic import Blueprint
bp = Blueprint('dp')
class pg:
def __init__(self, pg_pool):
self.pg_pool = pg_pool
async def fetch(self, sql, *args, **kwargs):
async with self.pg_pool.acquire() as connection:
return await connection.fetch(sql, *args, **kwargs)
async def execute(self, sql, *args, **kwargs):
async with self.pg_pool.acquire() as connection:
return await connection.execute(sql, *args, **kwargs)
@bp.listener('before_server_start')
async def init_pg(app, loop):
"""
Init Postgresql DB.
"""
bp.pg_pool = await create_pool(
**app.config.PG_CFG,
max_inactive_connection_lifetime=60,
min_size=1,
max_size=3,
loop=loop,
)
bp.pg = pg(bp.pg_pool)
print('-------- setup connection pool --------')现在在webapp.py中使用pg类
webapp.py:
@app.route("/")
async def root(req):
result = await app.pg.fetch('SELECT * FROM foo')发布于 2018-04-24 16:14:18
我自己没有用postgres做过,但是我用Redis做过类似的事情。此外,我知道其他人也使用过类似的设置,使用before_server_start来创建池。
另一种选择是
看看:https://github.com/Skyscanner/aiotask-context和https://github.com/MagicStack/contextvars。也许它们可以帮助您将连接之类的东西附加到循环中。
https://stackoverflow.com/questions/49978507
复制相似问题