Skip to content

Psycopg3

This example uses Psycopg3 directly. AkasicDB vector types must be registered for parameter binding and result conversion; call register_vector() for this.

Install

pip install "akasicdb"

Example

import psycopg

from akasicdb.psycopg import register_vector
from akasicdb.types import Hnsw, IndexOption

DB_URL = "postgresql://postgres:mysecretpassword@localhost:5432/postgres"

with psycopg.connect(DB_URL) as conn:
    conn.execute("CREATE EXTENSION IF NOT EXISTS akasicdb")
    conn.execute("SELECT akasicdb_admin.initialize()")
    register_vector(conn)

    conn.execute("DROP TABLE IF EXISTS documents")
    conn.execute("""
        CREATE TABLE documents (
            id SERIAL PRIMARY KEY,
            text TEXT NOT NULL,
            embedding vector(3) NOT NULL
        )
    """)

    conn.execute(
        "INSERT INTO documents (text, embedding) VALUES (%s, %s)",
        ("hello world", [1.0, 2.0, 3.0]),
    )
    conn.execute(
        "INSERT INTO documents (text, embedding) VALUES (%s, %s)",
        ("hello akasicdb", [1.0, 3.0, 4.0]),
    )

    conn.execute(
        "CREATE INDEX embedding_idx ON documents USING vectoron "
        "(embedding vector_l2_ops) WITH (options=$${}$$)".format(
            IndexOption(index=Hnsw(), threads=1).dumps()
        )
    )

    rows = conn.execute(
        "SELECT text, embedding <-> %s AS distance "
        "FROM documents ORDER BY distance LIMIT 5",
        ([1.0, 2.0, 3.5],),
    ).fetchall()

    for row in rows:
        print(row)

    conn.commit()

psycopg.connect() expects a Psycopg connection URL such as postgresql://....