1.aiopg连接
连接
1.使用aiopg.connet()连接
dbname=[db名字] user=[用户名] password=[密码] host=[主机] port=[端口]
⚠️警告内容
warnings.warn(f"Unclosed connection {self!r}", ResourceWarning)
Unclosed connection
connection: <aiopg.connection::Connection isexecuting=False, closed=1, echo=False, >
import aiopg
import asyncio
dsn = 'dbname=aiopg user=aiopg password=passwd host=127.0.0.1 port=5432'
async def go():
conn = await aiopg.connect(dsn)
cur = await conn.cursor()
await cur.execute("SELECT city,prcp FROM weather LIMIT 1;")
res = await cur.fetchall()
print(res) # [('San Francisco', 0.25)]
# 不加这一行会警告
await conn.close()
if __name__ == "__main__":
asyncio.run(go())
2.使用aiopg.create_pool()
用法一
pool.wait_closed()说明
将所有池连接标记为在返回池时关闭。 封闭池不允许获取新连接。
如果您想等待实际关闭获取的连接,请在 close() 之后调用 wait_closed()。
import aiopg
import asyncio
dsn = 'dbname=aiopg user=aiopg password=passwd host=127.0.0.1 port=5432'
async def go():
# minsize最小连接数
# maxsize最大连接数
pool = await aiopg.create_pool(dsn, minsize=1, maxsize=20)
# 获取连接
conn = await pool.acquire()
# 获取游标
with (await pool.cursor()) as cur:
await cur.execute("SELECT city,prcp FROM weather LIMIT 1;")
res = await cur.fetchall()
print(res) # [('San Francisco', 0.25)]
if cur:
# 关闭游标
cur.close()
# 释放回连接池的自由连接
await pool.release(conn)
# 关闭池中的所有空闲连接的协程,在下一个连接时,将重新创建至少获得最小的连
# await pool.clear()
# 这两个相当关闭连接池了(如果有多个任务的话,建议在最外层新建pool,把pool传入协程中,等所有协程结束只有在关闭连接池)
# 关闭水池。
pool.close()
# 等待关闭所有池的连接
await pool.wait_closed()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(go())
用法二 - 推荐使用
不用手动关闭游标和释放连接
import aiopg
import asyncio
dsn = 'dbname=aiopg user=aiopg password=passwd host=127.0.0.1 port=5432'
async def go():
pool = await aiopg.create_pool(dsn)
# 内部做了 await pool.release(conn)
async with pool.acquire() as conn:
# 内部做了 cur.close()
async with conn.cursor() as cur:
await cur.execute("SELECT city,prcp FROM weather LIMIT 1;")
res = await cur.fetchall()
print(res) # [('San Francisco', 0.25)]
# 这两个相当关闭连接池了(如果有多个任务的话,建议在最外层新建pool,把pool传入协程中,等所有协程结束只有在关闭连接池)
# 关闭水池。
pool.close()
# 等待关闭所有池的连接
await pool.wait_closed()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(go())
3.aiopg官网案列
这种方式就不用手动关闭了
import asyncio
import aiopg
dsn = 'dbname=aiopg user=aiopg password=passwd host=127.0.0.1 port=5432'
async def go():
async with aiopg.create_pool(dsn, minsize=1, maxsize=20) as pool:
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute("SELECT city,prcp FROM weather LIMIT 1;")
res = await cur.fetchall()
print(res) # [('San Francisco', 0.25)]
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(go())