Skip to main content

Amazon Aurora DSQL dialect for SQLAlchemy

Project description

Amazon Aurora DSQL dialect for SQLAlchemy

GitHub License PyPI - Version Discord chat

Introduction

The Aurora DSQL dialect for SQLAlchemy provides integration between SQLAlchemy ORM and Aurora DSQL. This dialect enables Python applications to leverage SQLAlchemy's powerful object-relational mapping capabilities while taking advantage of Aurora DSQL's distributed architecture and high availability.

Sample Application

There is an included sample application in examples/pet-clinic-app that shows how to use Aurora DSQL with SQLAlchemy. To run the included example please refer to the sample README.

Prerequisites

  • Python 3.10 or higher
  • SQLAlchemy 2.0.0 or higher
  • One of the following drivers:
    • psycopg 3.2.0 or higher
    • psycopg2 2.9.0 or higher

Installation

Install the packages using the commands below:

pip install aurora-dsql-sqlalchemy

# driver installation (in case you opt for psycopg)
# DO NOT use pip install psycopg-binary
pip install "psycopg[binary]"

# driver installation (in case you opt for psycopg2)
pip install psycopg2-binary

Dialect Configuration

After installation, you can connect to an Aurora DSQL cluster using the create_dsql_engine helper function:

from aurora_dsql_sqlalchemy import create_dsql_engine

engine = create_dsql_engine(
    host="<CLUSTER_ENDPOINT>",
    user="<CLUSTER_USER>",
    driver="psycopg",  # or "psycopg2"
)

The helper function handles:

  • IAM authentication via the Aurora DSQL Python Connector
  • SSL configuration with certificate verification
  • Direct SSL negotiation optimization (when supported by libpq >= 17)
  • Connection pooling with sensible defaults

For more control, you can customize additional parameters:

engine = create_dsql_engine(
    host="<CLUSTER_ENDPOINT>",
    user="<CLUSTER_USER>",
    driver="psycopg",
    pool_size=10,
    max_overflow=20,
)

Note: Each connection has a maximum duration limit. See the Maximum connection duration time limit in the Cluster quotas and database limits in Amazon Aurora DSQL page.

SSL/TLS Configuration

Aurora DSQL requires TLS for all connections. Plaintext connections are not supported. Enabling certificate verification protects against on-path and impersonation attacks.

create_dsql_engine defaults to:

  • sslmode="verify-full" - verifies the server certificate and hostname
  • sslrootcert="system" - uses the default certificate authority (CA) trust defined by libpq’s TLS backend

See SSL Configuration for detailed setup instructions.

Best Practices

Primary Key Generation

SQLAlchemy applications connecting to Aurora DSQL should use UUID for the primary key column since auto-incrementing integer keys (sequences or serial) are not supported in DSQL. The following column definition can be used to define an UUID primary key column.

Column(
    "id",
    UUID(as_uuid=True),
    primary_key=True,
    default=text('gen_random_uuid()')
)

gen_random_uuid() returns an UUID version 4 as the default value.

Dialect Features and Limitations

  • Column Metadata: The dialect fixes an issue related to "datatype json not supported" when calling SQLAlchemy's metadata() API.

  • Foreign Keys: Aurora DSQL does not support foreign key constraints. The dialect disables these constraints, but be aware that referential integrity must be maintained at the application level.

  • Index Creation: Aurora DSQL does not support CREATE INDEX or CREATE UNIQUE INDEX commands. The dialect instead uses CREATE INDEX ASYNC and CREATE UNIQUE INDEX ASYNC commands. See the Asynchronous indexes in Aurora DSQL page for more information.

    The following parameters are used for customizing index creation

    • auroradsql_include - specifies which columns to includes in an index by using the INCLUDE clause:

      Index(
          "include_index",
          table.c.id,
          auroradsql_include=['name', 'email']
      )
      

      Generated SQL output:

      CREATE INDEX ASYNC include_index ON table (id) INCLUDE (name, email)
      
    • auroradsql_nulls_not_distinct - controls how NULL values are treated in unique indexes:

      Index(
          "idx_name",
          table.c.column,
          unique=True,
          auroradsql_nulls_not_distinct=True
      )
      

      Generated SQL output:

      CREATE UNIQUE INDEX idx_name ON table (column) NULLS NOT DISTINCT
      
  • Index Interface Limitation: NULLS FIRST | LAST - SQLalchemy's Index() interface does not have a way to pass in the sort order of null and non-null columns. (Default: NULLS LAST). If NULLS FIRST is required, please refer to the syntax as specified in Asynchronous indexes in Aurora DSQL and execute the corresponding SQL query directly in SQLAlchemy.

  • Psycopg (psycopg3) support: When connecting to DSQL using the default postgresql dialect with psycopg, an unsupported SAVEPOINT error occurs. The DSQL dialect addresses this issue by disabling the SAVEPOINT during connection.

Developer instructions

Instructions on how to build and test the dialect are available in the Developer Instructions.

Security

See CONTRIBUTING for more information.

License

This project is licensed under the Apache-2.0 License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aurora_dsql_sqlalchemy-1.1.2.tar.gz (79.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aurora_dsql_sqlalchemy-1.1.2-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file aurora_dsql_sqlalchemy-1.1.2.tar.gz.

File metadata

  • Download URL: aurora_dsql_sqlalchemy-1.1.2.tar.gz
  • Upload date:
  • Size: 79.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aurora_dsql_sqlalchemy-1.1.2.tar.gz
Algorithm Hash digest
SHA256 66ede7978344694e4500a7575c7e9b1ff40cd8b0ed83b601325ebe1d530a4f0e
MD5 dbbae12aa8d8fe6d809bacf92c63a6f8
BLAKE2b-256 e580353c9fa70e3b07b2eb47c0cc11003b26eda569c7e120c2615135575d1483

See more details on using hashes here.

Provenance

The following attestation bundles were made for aurora_dsql_sqlalchemy-1.1.2.tar.gz:

Publisher: python-sqlalchemy-release.yml on awslabs/aurora-dsql-orms

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aurora_dsql_sqlalchemy-1.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for aurora_dsql_sqlalchemy-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 6a2e7a78091f976e6afb8d79d97eb348071d0c4c986a5a04cacf37666151bf50
MD5 7481ad3874ce9203c9763ecf88c40282
BLAKE2b-256 31de5f142bcc7b003ef99b3dce656a076923d9955031cb6208f5bf05a8739d32

See more details on using hashes here.

Provenance

The following attestation bundles were made for aurora_dsql_sqlalchemy-1.1.2-py3-none-any.whl:

Publisher: python-sqlalchemy-release.yml on awslabs/aurora-dsql-orms

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page