Skip to main content

Lean Aurora PostgreSQL to Redshift loader via copy_expert + S3 COPY

Project description

aurora_to_rs

Lean Aurora PostgreSQL to Redshift loader using psycopg2.copy_expert + S3 + Redshift COPY.

Bypasses pandas entirely -- ~10x faster than DataFrame-based approaches for large tables. IAM role auth only.

Install

pip install aurora_to_rs

Quick Start

from aurora_to_rs import aurora_to_rs

loader = aurora_to_rs(
    region_name='ap-south-1',
    s3_bucket='my-bucket',
    redshift_c=redshift_conn,          # psycopg2 connection (autocommit=True)
    postgres_engine=pg_engine,          # SQLAlchemy engine
    iam_role_arn='arn:aws:iam::123456:role/MY_ROLE'
)

3 Strategies

1. full_load -- Full table refresh (TRUNCATE + COPY)

For master/reference tables where filter_cond = '1=1'.

loader.full_load("SELECT * FROM master.items", "master.items")

2. delete_and_insert -- Delete by filter + COPY

For transaction tables with del_table = 'Y' (incremental by date/timestamp filter).

loader.delete_and_insert(
    "SELECT * FROM tran.shipment_au WHERE create_datetime >= current_date-3",
    "tran.shipment_au",
    "create_datetime >= current_date-3",
    min_timestamp='2026-02-19',          # optional safety overlap
    timestamp_col='create_datetime'
)

3. upsert -- Staging-based incremental upsert

For tables with key-based upsert (everything else). NULL-safe key matching.

loader.upsert(
    "SELECT * FROM tran.orders WHERE dt >= current_date-1",
    "tran.orders",
    ['order_id']
)

How It Works

Aurora (PG COPY TO STDOUT)  -->  BytesIO (strip \x00, parse header)  -->  S3  -->  Redshift COPY FROM
  • Streams CSV via psycopg2.copy_expert -- no pandas DataFrame in the path
  • Strips null bytes (\x00) from Aurora text columns automatically
  • Cleans column names (/, ., - replaced with _) to match Redshift DDL
  • S3 upload with retry (exponential backoff on SSL/connection errors)
  • All methods return row_count for logging

API Reference

Method Args Returns Use Case
full_load(sql, dest) source SQL, dest table row_count Full refresh
delete_and_insert(sql, dest, filter, ...) + min_timestamp, timestamp_col row_count Incremental by date
upsert(sql, dest, keys) + upsert_columns list row_count Key-based upsert

Requirements

  • Python >= 3.8
  • boto3, psycopg2
  • IAM role with S3 read/write and Redshift COPY permissions

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_to_rs-0.1.9.tar.gz (5.9 kB view details)

Uploaded Source

Built Distribution

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

aurora_to_rs-0.1.9-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file aurora_to_rs-0.1.9.tar.gz.

File metadata

  • Download URL: aurora_to_rs-0.1.9.tar.gz
  • Upload date:
  • Size: 5.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for aurora_to_rs-0.1.9.tar.gz
Algorithm Hash digest
SHA256 1f6fec2b3fd255810d7ad28a4fe57f69c94940178f21cfcebff2583fc3fc30af
MD5 80d3163381eb2497b2253daf97e49e35
BLAKE2b-256 0e9bd8d86ab9253bd5d0735ca2179af3a81c31b4157a469bcf300806ff3bc40f

See more details on using hashes here.

File details

Details for the file aurora_to_rs-0.1.9-py3-none-any.whl.

File metadata

  • Download URL: aurora_to_rs-0.1.9-py3-none-any.whl
  • Upload date:
  • Size: 6.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for aurora_to_rs-0.1.9-py3-none-any.whl
Algorithm Hash digest
SHA256 90267aad801c6748d60dc715773084d81ba4062191f9c33f27490d8ff3882561
MD5 0b491e428da61578ece6f26358d8eb16
BLAKE2b-256 e28a8e3b44f5e1153fa1ecfc108fd21747ca05920bfebfc4403d4948f8726322

See more details on using hashes here.

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