---
title: Python SDK
sort: 100
section-id: client-sdks
keywords: Python, SDK, client, connection, CRUD, vector operations, psycopg
description: Installing and using the NeuralDB Python SDK — connection, CRUD, and vector operations
language: en
---

# Python SDK

Built on `psycopg3` with NeuralDB-specific helpers for vector operations and batch ingestion.

## Installation

```bash
pip install neuraldb
pip install neuraldb[asyncio]  # async support
```

## Connecting

```python
from neuraldb import NeuralDB

client = NeuralDB("postgresql://neuraldb:password@localhost:5432/mydb")

# Async
from neuraldb import AsyncNeuralDB
async with AsyncNeuralDB("postgresql://...") as client:
    result = await client.query("SELECT 1")

# Pool
from neuraldb import NeuralDBPool
pool = NeuralDBPool("postgresql://...", min_size=5, max_size=20)
with pool.acquire() as client:
    result = client.query("SELECT COUNT(*) FROM documents")
```

## CRUD Operations

```python
from neuraldb import Vector

client.execute(
    "INSERT INTO documents (content, source, embedding) VALUES (%s, %s, %s)",
    ("My document content", "web-scraper", Vector([0.023, -0.187, 0.412]))
)

rows = client.query("SELECT id, content FROM documents WHERE source = %s", ("web-scraper",))
for row in rows:
    print(row["id"], row["content"])

client.execute("UPDATE documents SET content = %s, embedding = %s WHERE id = %s",
    ("Updated", Vector(new_embedding), doc_id))
client.execute("DELETE FROM documents WHERE id = %s", (doc_id,))
```

## Vector Search

```python
results = client.query("""
    SELECT id, content, 1 - (embedding <=> %s) AS similarity
    FROM documents WHERE embedding IS NOT NULL
    ORDER BY embedding <=> %s LIMIT 10
""", (Vector(query_embedding), Vector(query_embedding)))
```

## Transactions

```python
with client.transaction():
    client.execute("INSERT INTO documents (content, embedding) VALUES (%s, %s)", (content, Vector(embedding)))
    client.execute("UPDATE stats SET count = count + 1")
```

## Bulk Ingestion

```python
from neuraldb import BulkIngestor

ingestor = BulkIngestor(client, table="documents",
    columns=["content", "source", "embedding"], batch_size=1000,
    embedding_model="openai/text-embedding-3-small", embedding_column="embedding", text_column="content")

with ingestor as ing:
    for doc in docs:
        ing.add(doc)
print(f"Ingested {ingestor.total_inserted} documents")
```
