Python - asyncpg

  • asyncpg is a database interface library designed specifically for PostgreSQL and asyncio.

    Introduction

    asyncpg is an efficient implementation of the PostgreSQL binary protocol for Python’s asyncio. It provides fast queries, native protocol features, and convenient primitives for async I/O.

    Setup

    Terminal window
    uv init asyncpg-basic
    cd asyncpg-basic
    uv add asyncpg

    Create and start a PostgreSQL instance as explained in Postgres - Basic.

    Then create a database named test:

    Terminal window
    create database test;

    Basic Usage

    test_database.py

    Create test_database.py:

    import asyncio
    import asyncpg
    import datetime
    async def main():
    # Establish a connection to an existing database named "test"
    conn = await asyncpg.connect("postgresql://postgres:password@localhost/test")
    try:
    # Execute a statement to create a new table.
    await conn.execute(
    """
    create table if not exists users(
    id serial primary key,
    name text unique,
    dob date
    )"""
    )
    # Insert a record into the created table.
    await conn.execute(
    """
    insert into users(name, dob) values($1, $2) on conflict(name) do nothing""",
    "Alice",
    datetime.date(1980, 25, 1),
    )
    # Select a row from the table.
    row = await conn.fetchrow("select * from users where name = $1", "Alice")
    # *row* now contains <Record id=1 name='Alice' dob=datetime.date(1980, 25, 1)>
    print(row)
    finally:
    # Close the connection.
    await conn.close()
    asyncio.run(main())

    Run the script and you should see:

    Terminal window
    <Record id=1 name='Alice' dob=datetime.date(1980, 1, 25)>

    Notes on parameters and DB-API

    • asyncpg uses PostgreSQL’s native parameter placeholders: $1, $2, …
    • asyncpg does not implement PEP 249 (DB-API 2.0). It favors PostgreSQL’s native parameterization and avoids query rewriting.

    Test

    Further reading