sqlalchemy-vertica
Modern Vertica Analytic Database dialect for SQLAlchemy 2.0+ with full support for Async operations, Alembic migrations, and modern Python (3.9 - 3.14+).
Features
Full SQLAlchemy 2.0+ Architecture: Built on DefaultDialect with query caching (supports_statement_cache = True), 2.0 execution semantics, and parameter-bound reflection.
First-Class Async Engine Support: Run queries asynchronously with create_async_engine() and AsyncSession via vertica+vertica_python_async:// without blocking the asyncio event loop.
Alembic Migrations: Native VerticaImpl integration with transactional DDL, type synonym resolution, and index no-op handling (since Vertica utilizes projections).
Multi-Driver Support: * vertica-python (Synchronous pure-Python DBAPI driver) * vertica-python-async (Asynchronous DBAPI adapter for non-blocking asyncio / FastAPI apps) * pyodbc (ODBC driver) * turbodbc (High-speed ODBC driver for Arrow / NumPy / Pandas data workflows)
Rich Vertica Data Types: * Geospatial: GEOMETRY, GEOGRAPHY * Identifiers: native UUID * Large objects: LONG VARCHAR, LONG VARBINARY (up to 32MB) * Complex types: ARRAY, MAP, ROW (Vertica 10+) * Temporal: TIMESTAMPTZ, TIMETZ, INTERVAL
Complete Reflection: Automatic introspection of schemas, tables, temp tables, views, view definitions, columns, primary keys, foreign keys, unique constraints, check constraints, table & column comments.
Installation
Install from PyPI with your desired driver extras:
# Pure Python sync driver (recommended for sync applications)
pip install "sqlalchemy-vertica[vertica-python]"
# Pure Python async driver (for AsyncEngine / FastAPI / asyncio)
pip install "sqlalchemy-vertica[asyncio]"
# ODBC drivers
pip install "sqlalchemy-vertica[pyodbc]"
pip install "sqlalchemy-vertica[turbodbc]"
# Alembic migrations support
pip install "sqlalchemy-vertica[alembic]"
# Install all drivers and tools
pip install "sqlalchemy-vertica[all]"
Connection Strings
import sqlalchemy as sa
from sqlalchemy.ext.asyncio import create_async_engine
# 1. Async (for FastAPI / asyncio applications)
async_engine = create_async_engine(
"vertica+vertica_python_async://user:pwd@host:5433/database?connection_timeout=10"
)
# 2. Sync vertica-python
engine = sa.create_engine(
"vertica+vertica_python://user:pwd@host:5433/database?connection_timeout=10"
)
# 3. PyODBC with connection string
engine_pyodbc = sa.create_engine(
"vertica+pyodbc:///?odbc_connect=DSN%3DVerticaDSN"
)
# 4. Turbodbc with DSN
engine_turbodbc = sa.create_engine(
"vertica+turbodbc:///?DSN=VerticaDSN"
)
Quick Start
Synchronous SQLAlchemy 2.0
from sqlalchemy import create_engine, text
engine = create_engine("vertica+vertica_python://user:pwd@localhost:5433/mydb")
with engine.connect() as conn:
result = conn.execute(text("SELECT version()"))
print(result.scalar())
# Transaction block
with engine.begin() as conn:
conn.execute(
text("INSERT INTO my_table (name) VALUES (:name)"),
{"name": "Alice"}
)
Asynchronous SQLAlchemy 2.0 & FastAPI
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
async def main():
engine = create_async_engine(
"vertica+vertica_python_async://user:pwd@localhost:5433/mydb",
pool_size=10,
)
async with engine.connect() as conn:
result = await conn.execute(text("SELECT 1"))
print(result.scalar())
# Using AsyncSession
session_factory = async_sessionmaker(engine, class_=AsyncSession)
async with session_factory() as session:
result = await session.execute(text("SELECT COUNT(*) FROM my_table"))
print("Count:", result.scalar())
await engine.dispose()
asyncio.run(main())
Alembic Migrations
In your Alembic env.py, simply import sqlalchemy_vertica:
import sqlalchemy_vertica # Registers VerticaImpl plugin automatically
from alembic import context
# configure context
context.configure(
connection=connection,
target_metadata=target_metadata,
transactional_ddl=True,
)
Vertica does not support traditional B-tree indexes (it utilizes projections). sqlalchemy-vertica treats index creation/dropping as safe no-ops in migrations to ensure multi-database migration scripts run seamlessly.
Custom Data Types
from sqlalchemy import Column, Integer, Table, MetaData
from sqlalchemy_vertica import (
GEOMETRY,
GEOGRAPHY,
UUID,
LONG_VARCHAR,
ARRAY,
MAP,
ROW,
TIMESTAMPTZ,
)
metadata = MetaData()
places = Table(
"places",
metadata,
Column("id", Integer, primary_key=True, autoincrement=True),
Column("guid", UUID, nullable=False),
Column("description", LONG_VARCHAR),
Column("location", GEOMETRY(srid=4326)),
Column("tags", ARRAY(LONG_VARCHAR)),
Column("metadata", MAP(LONG_VARCHAR, LONG_VARCHAR)),
Column("created_at", TIMESTAMPTZ),
)
Testing & Coverage
Run the automated test suite with pytest and pytest-cov:
pytest -v --cov=sqlalchemy_vertica --cov-report=term-missing
Support
If you find this project helpful and want to support its maintenance and development, you can buy me a coffee:
License
MIT License. See LICENSE for details.
Metadata
Release files for sqlalchemy-vertica 1.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sqlalchemy_vertica-1.0.2.tar.gz | 25.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sqlalchemy_vertica-1.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 43.4 kB
Release files / sqlalchemy_vertica-1.0.2.tar.gz
| Download URL | sqlalchemy_vertica-1.0.2.tar.gz |
|---|---|
| Size | 25.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3bf5bb38729847250a6e04851fe04ea9fec6e294b69f78ed372c80a216f9d25d
|
|
BLAKE2b-256 checksum How to use checksums |
933c01826eceb59ae85f2c2145ecc8bfebcea47bf4f26c58523b510910030e09
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / sqlalchemy_vertica-1.0.2-py3-none-any.whl
| Download URL | sqlalchemy_vertica-1.0.2-py3-none-any.whl |
|---|---|
| Size | 17.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5e8b1361cd661fb744dbcd267c37f9f3ca1c04cba74763f84bdf1c197f3cc2d4
|
|
BLAKE2b-256 checksum How to use checksums |
3a3b2f5d3295f3af950b1872186bb7fa242c3eaf5c4f3b43ed33de18dc53afd2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency log