Skip to main content

connparse

Connparse parses database connection strings, DSNs, URLs, file paths, and cloud storage URIs into one predictable Python dict.

Connparse is useful when your app accepts connection strings from different systems and you want to pull out the host, port, database, bucket, path, credentials, query options, and a safe redacted string.

Supported sources include PostgreSQL, MySQL, MariaDB, SQLite, DuckDB, ClickHouse, Redis, Memcached, Elasticsearch, MongoDB, CockroachDB, QuestDB, YugabyteDB, TiDB, Valkey, Dragonfly, OpenSearch, FerretDB, ElastiCache, DocumentDB, SQL Server, Oracle, Snowflake, Cassandra, BigQuery, Redshift, Aurora, Neo4j, Trino, Databricks, DynamoDB, StarRocks, SAP HANA, Athena, Spanner, Google Cloud Storage, Azure Blob, Azure Data Lake Storage, Azure Files, Azure Cosmos DB, Business Central, TallyPrime, Amazon S3, and local file paths.

Install

pip install connparse

Basic Usage

from connparse import parse

result = parse("postgres://user:pass@localhost:5432/app?sslmode=require")

if not result["ok"]:
    print(result["errors"])
else:
    print(result["value"])

Result:

{
  "scheme": "postgres",
  "type": "database",
  "authority": {
    "host": "localhost",
    "port": 5432
  },
  "resource": {
    "type": "database",
    "name": "app"
  },
  "path": "",
  "query": {
    "sslmode": "require"
  },
  "fragment": null,
  "credentials": {
    "username": "user",
    "password": "pass"
  },
  "options": {},
  "raw": "postgres://user:pass@localhost:5432/app?sslmode=require",
  "safe": "postgres://user:***@localhost:5432/app?sslmode=require"
}

Use parse() for form handling, validation, and showing parsed connection details to users.

result = parse(input)

if result["ok"]:
    address = result["value"]
    save_connection(
        host=address["authority"].get("host"),
        port=address["authority"].get("port"),
        database=address["resource"]["name"],
        safe_label=address["safe"],
    )

Use safe for logs and UI labels. Do not log raw or credentials unless the user explicitly asks to reveal secrets.

logger.info("connection=%s", result["value"]["safe"])

Use parse_normalize() when you need a stable identity for dedupe, cache keys, or config comparison.

from connparse import parse_normalize

parse_normalize("postgresql://LOCALHOST:5432/app?sslmode=require")["value"]["canonical"]
# "postgres://localhost/app?sslmode=require"

Use provider when the string does not clearly identify the source type.

parse("host=db.example.com port=5432 dbname=app user=alice", {
    "provider": "postgres",
})

parse("https://clickhouse.example.com:8443/default", {
    "provider": "clickhouse",
})

Use strict when you want unknown query parameters to fail validation.

parse("postgres://localhost/app?unexpected=1", {"strict": True})

Examples

Source Input Parsed result
PostgreSQL postgres://user:pass@localhost:5432/app?sslmode=require authority.host = "localhost", authority.port = 5432, resource.name = "app", query.sslmode = "require"
MySQL mysql://root:secret@127.0.0.1/shop?charset=utf8mb4 authority.host = "127.0.0.1", authority.port = 3306, resource.name = "shop", query.charset = "utf8mb4"
MariaDB mariadb://root:secret@mariadb.example.com:3306/app authority.host = "mariadb.example.com", authority.port = 3306, resource.name = "app"
SQLite sqlite::memory: scheme = "sqlite", resource.name = ":memory:", path = ":memory:", options.memory = true
DuckDB duckdb:///tmp/analytics.duckdb?access_mode=read_only scheme = "duckdb", path = "/tmp/analytics.duckdb", query.access_mode = "read_only"
ClickHouse jdbc:clickhouse:http://localhost:8123/analytics?ssl=false authority.host = "localhost", authority.port = 8123, resource.name = "analytics", options.protocol = "http"
Memcached memcached://cache.example.com authority.host = "cache.example.com", authority.port = 11211, type = "cache"
Redis rediss://:pass@cache.example.com/0 authority.host = "cache.example.com", authority.port = 6379, resource.name = "0", options.tls = true
Elasticsearch elasticsearch+https://elastic:secret@es.example.com:9243/logs?api_key=abc authority.host = "es.example.com", authority.port = 9243, resource.name = "logs", credentials.api_key = "abc"
MongoDB mongodb+srv://user:pass@cluster.mongodb.net/app?retryWrites=true authority.host = "cluster.mongodb.net", resource.name = "app", query.retryWrites = "true", options.srv = true
CockroachDB cockroach://root@servername:26257/mydb?sslmode=disable authority.host = "servername", authority.port = 26257, resource.name = "mydb", options.compatible_with = "postgres"
QuestDB https::addr=questdb.example.com:9000;username=admin;password=quest;auto_flush_rows=5000; authority.host = "questdb.example.com", authority.port = 9000, query.auto_flush_rows = "5000", options.ingestion = true
YugabyteDB yugabyte://yugabyte:yugabyte@localhost:5433/yugabyte?loadBalance=any authority.host = "localhost", authority.port = 5433, resource.name = "yugabyte", query.loadBalance = "any"
S3 s3://my-bucket/path/to/file.csv?versionId=123 authority.bucket = "my-bucket", resource.name = "my-bucket", path = "path/to/file.csv"
File file:///tmp/data.csv#header scheme = "file", path = "/tmp/data.csv", fragment = "header"

Metadata

Release files for connparse 0.10.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for connparse 0.10.0
File Size Uploaded
connparse-0.10.0.tar.gz 20.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for connparse 0.10.0
File Interpreter ABI Platform
connparse-0.10.0-py3-none-any.whl Python 3 none any Details

Total release size: 40.1 kB

Release files / connparse-0.10.0.tar.gz

Download URL connparse-0.10.0.tar.gz
Size 20.2 kB
Tags Source
SHA-256 checksum
How to use checksums
70b48a5c9f14239c0a24d5c5e1eadcc7718b5b4b433a67a30cbbb6437f7fb1d7
BLAKE2b-256 checksum
How to use checksums
5f13e08c7f9bf58f9957203293ebb3702bcf5ad492fabd7ce9a85af8be85aafd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

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 Sep 16, 2026.

Transparency log

Release files / connparse-0.10.0-py3-none-any.whl

Download URL connparse-0.10.0-py3-none-any.whl
Size 19.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
08097736d581020d0935eed6224f5ef71b5d8603b07de4a31fe6822d0524b295
BLAKE2b-256 checksum
How to use checksums
2dd86e96a06df8cbf1e98fb4d9794ed2ec2cc613a0b1451db6c94bd03000beb2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

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 Sep 16, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.10.0 This release

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page