Initial Release
Access IRIS through the entire PostgreSQL ecosystem - Connect BI tools, Python frameworks, data pipelines, and thousands of PostgreSQL-compatible clients to InterSystems IRIS databases with zero code changes.
Verified compatibility with PostgreSQL clients across 8 languages - no IRIS-specific drivers needed:
Connection: postgresql://localhost:5432/USER - thatβs it!
git clone https://github.com/intersystems-community/iris-pgwire.git cd iris-pgwire docker-compose up -dTest it works
psql -h localhost -p 5432 -U _SYSTEM -d USER -c "SELECT 'Hello from IRIS!'"
pip install iris-pgwire psycopg[binary]Configure IRIS connection
export IRIS_HOST=localhost IRIS_PORT=1972 IRIS_USERNAME=_SYSTEM IRIS_PASSWORD=SYS IRIS_NAMESPACE=USER
Start server
python -m iris_pgwire.server
For InterSystems IRIS 2024.1+ with ZPM package manager:
// Install the package zpm "install iris-pgwire"// Start the server manually
do ##class(IrisPGWire.Service).Start()
// Check server status
do ##class(IrisPGWire.Service).ShowStatus()
From terminal:
# Install iris session IRIS -U USER 'zpm "install iris-pgwire"'Start server
iris session IRIS -U USER 'do ##class(IrisPGWire.Service).Start()'
import psycopg
with psycopg.connect('host=localhost port=5432 dbname=USER') as conn:
cur = conn.cursor()
cur.execute('SELECT COUNT(*) FROM YourTable')
print(f'Rows: {cur.fetchone()[0]}')
171/171 tests passing across 8 programming languages:
| Language | Verified Clients | Test Coverage |
|---|---|---|
| Python | psycopg3, asyncpg, SQLAlchemy | 100% (21 tests) |
| Node.js | pg (node-postgres) | 100% (17 tests) |
| Java | PostgreSQL JDBC | 100% (27 tests) |
| .NET | Npgsql | 100% (15 tests) |
| Go | pgx v5 | 100% (19 tests) |
| Ruby | pg gem | 100% (25 tests) |
| Rust | tokio-postgres | 100% (22 tests) |
| PHP | PDO PostgreSQL | 100% (25 tests) |
ORMs & BI Tools: Prisma, Sequelize, Hibernate, Drizzle, Apache Superset, Metabase, Grafana
See Client Compatibility Guide for detailed testing results and ORM setup examples.
pgvector Syntax: Use familiar <=> and <#> operators - auto-translated to IRIS VECTOR_COSINE/DOT_PRODUCT. HNSW indexes provide 5Γ speedup on 100K+ vectors. See Vector Operations Guide
ORM Compatibility: Automatic public β SQLUser schema mapping for Prisma, SQLAlchemy, Drizzle, Hibernate introspection. Catalog emulation with 6 pg_catalog tables + 5 functions. See pg_catalog Documentation
Enterprise Security: SCRAM-SHA-256, OAuth 2.0, IRIS Wallet authentication. Industry-standard security matching PgBouncer, YugabyteDB. See Deployment Guide
Performance: ~4ms protocol overhead, dual backend (DBAPI/Embedded), async SQLAlchemy support. See Performance Benchmarks
# Connect to IRIS via PostgreSQL protocol psql -h localhost -p 5432 -U _SYSTEM -d USERSimple queries
SELECT * FROM MyTable LIMIT 10;
Vector similarity search
SELECT id, VECTOR_COSINE(embedding, TO_VECTOR('[0.1,0.2,0.3]', DOUBLE)) AS score
FROM vectors
ORDER BY score DESC
LIMIT 5;
import psycopgwith psycopg.connect('host=localhost port=5432 dbname=USER user=_SYSTEM password=SYS') as conn:
# Simple query
with conn.cursor() as cur:
cur.execute('SELECT COUNT(*) FROM MyTable')
count = cur.fetchone()[0]
print(f'Total rows: {count}')# Parameterized query with conn.cursor() as cur: cur.execute('SELECT * FROM MyTable WHERE id = %s', (42,)) row = cur.fetchone() # Vector search with parameter binding query_vector = [0.1, 0.2, 0.3] # Works with any embedding model with conn.cursor() as cur: cur.execute(""" SELECT id, VECTOR_COSINE(embedding, TO_VECTOR(%s, DOUBLE)) AS score FROM vectors ORDER BY score DESC LIMIT 5 """, (query_vector,)) results = cur.fetchall()
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy import text from fastapi import FastAPI, DependsSetup
engine = create_async_engine("postgresql+psycopg://localhost:5432/USER")
SessionLocal = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
app = FastAPI()async def get_db():
async with SessionLocal() as session:
yield sessionFastAPI endpoint with async IRIS query
@app.get("/users/{user_id}")
async def get_user(user_id: int, db: AsyncSession = Depends(get_db)):
result = await db.execute(
text("SELECT * FROM users WHERE id = :id"),
{"id": user_id}
)
return result.fetchone()
π Complete Documentation β - Full navigation hub with all guides, architecture docs, and troubleshooting
171/171 tests passing - Verified compatibility with Python, Node.js, Java, .NET, Go, Ruby, Rust, PHP PostgreSQL clients
What Works: Core protocol (queries, transactions, COPY), Enterprise auth (SCRAM-SHA-256, OAuth 2.0), pgvector operators, ORM introspection
Architecture: SSL/TLS via reverse proxy (nginx/HAProxy), OAuth 2.0 instead of Kerberos - industry patterns matching PgBouncer, YugabyteDB
See Roadmap & Limitations for details
# Clone repository git clone https://github.com/intersystems-community/iris-pgwire.git cd iris-pgwireInstall development dependencies
uv sync --frozen
Start development environment
docker-compose up -d
Run tests
pytest -v
Code Quality: black (formatter), ruff (linter), pytest (testing)
MIT License - See LICENSE for details
Questions? Open an issue on GitHub