Skip to main content

Internal Partenamut library for PostgreSQL access using Psycopg 3

Project description

aa-psycopg

Internal Partenamut library for PostgreSQL access using Psycopg 3.
Provides a simple and efficient interface for interacting with PostgreSQL using:

  • A direct connection (PostgreSQLConnection)
  • A connection pool (PostgreSQLPool)

Supports query execution (SELECT, INSERT, UPDATE, DELETE), transactions, schema caching, and query runtime statistics.


Installation

pip install aa-psycopg

Requirements


Features

  • Easy-to-use wrapper for psycopg3.
  • Connection pooling via psycopg_pool.
  • Automatic query runtime tracking.
  • Safe connection string handling (masks passwords in logs).
  • Schema caching for executed queries.

API overview

  • ping(retries=0, timeout=60, query_name="ping") -> bool
    Test database connectivity.
  • read(query, params=None, query_name=None) -> list[dict]
    Execute a SELECT query. Set query_name to track query runtime statistics.
  • write(query, params=None, returning=False, query_name=None) -> list[dict] | None
    Execute INSERT/UPDATE/DELETE (optionally returning results). Set query_name to track query runtime statistics.
  • execute_transaction(queries_params, query_name=None)
    Run multiple queries inside a transaction. Set query_name to track query runtime statistics.
  • get_stats() -> dict
    Retrieve runtime stats (execution time & call count per query_name).
  • get_schema(query) -> list[psycopg.Column]
    Get schema for a previously executed query.

Usage

Direct Connection

import logging
import json

from aa_psycopg.connection import PostgreSQLConnection

# Configure logging (can adjust level or handlers as needed)
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)

with PostgreSQLConnection(
    user="myuser",
    password="mypassword",
    host="localhost",
    port=5432,
    db="mydatabase"
) as client:
    # Check if database is alive
    client.ping()

    # Read data
    rows = client.read("SELECT * FROM my_table", query_name="fetch_all")
    logger.info("Fetched rows: %s", rows)

    # Write data
    client.write(
        "INSERT INTO my_table (name) VALUES (%(name)s)",
        params={"name": "example"},
        query_name="insert_row"
    )
    logger.info("Inserted row into my_table")

    # Transaction
    client.execute_transaction([
        ("INSERT INTO my_table (name) VALUES (%(name)s)", {"name": "row1"}),
        ("INSERT INTO my_table (name) VALUES (%(name)s)", {"name": "row2"}),
    ], query_name="bulk_insert")
    logger.info("Executed bulk insert transaction")

    # Query stats
    stats = client.get_stats()
    logger.info("Query stats: %s", json.dumps(stats, indent=4))

Connection Pool

import logging
import json
from aa_psycopg.pool import PostgreSQLPool

# Configure logging (can be redirected to CloudWatch or file)
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)

with PostgreSQLPool(
    user="myuser",
    password="mypassword",
    host="localhost",
    port=5432,
    db="mydatabase",
    min_size=1,
    max_size=5
) as client:
    # Check connectivity
    client.ping()

    # Fetch results
    results = client.read("SELECT * FROM users WHERE active = true", query_name="active_users")
    logger.info("Fetched results: %s", results)

    # Insert with RETURNING
    new_ids = client.write(
        "INSERT INTO users (name) VALUES (%(name)s) RETURNING id",
        params={"name": "Alice"},
        returning=True,
        query_name="insert_user"
    )
    logger.info("Inserted new user IDs: %s", new_ids)

    # Bulk transaction
    client.execute_transaction([
        ("UPDATE users SET active=false WHERE id=%(id)s", {"id": 1}),
        ("DELETE FROM users WHERE active=false", None),
    ], query_name="cleanup")
    logger.info("Executed cleanup transaction")

    # Stats (dump as JSON)
    stats = client.get_stats()
    logger.info("Query stats: %s", json.dumps(stats, indent=4))

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aa_psycopg-0.1.4.tar.gz (9.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aa_psycopg-0.1.4-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file aa_psycopg-0.1.4.tar.gz.

File metadata

  • Download URL: aa_psycopg-0.1.4.tar.gz
  • Upload date:
  • Size: 9.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.7

File hashes

Hashes for aa_psycopg-0.1.4.tar.gz
Algorithm Hash digest
SHA256 a479d17a76209b1172587c0da177fb9fbaa061bc93d0e04abca7811ac9c3ca9a
MD5 91622dc4e03e3a9d1c645d022ec05779
BLAKE2b-256 f5a89386d81e266049be16f3172939b5bd9ec3a231c473318d2ff944cc95ddb6

See more details on using hashes here.

File details

Details for the file aa_psycopg-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: aa_psycopg-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.7

File hashes

Hashes for aa_psycopg-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 928479d1f3ec97df38fcedcf16e744eca02c0f27ebb770f6a4787e0bbe933bcb
MD5 3c949eb49d6509dbd541761f522ff93f
BLAKE2b-256 f81d91b6e75f9fd2cbf5599892d66e37d117238d789c5e7911ef6de8b2253baa

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page