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())
posted @ 2022-05-14 18:40  lxd670  阅读(123)  评论(0编辑  收藏  举报