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.5.tar.gz (5.6 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.5-py3-none-any.whl (6.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: aurora_to_rs-0.1.5.tar.gz
  • Upload date:
  • Size: 5.6 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.5.tar.gz
Algorithm Hash digest
SHA256 42dc860437032be57f9cba0b6736343c7c986bd84065ca4a80fb68b38f056137
MD5 6cf40149479da41723d2e05b5c9c0c76
BLAKE2b-256 1e05994e1266cbe5618611fe3de5f80565c0fc7a811bf9d1db966ca7c9f012a5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: aurora_to_rs-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 6.2 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.5-py3-none-any.whl
Algorithm Hash digest
SHA256 31c41a9b453864e3055df4954de6d4f59395897fa36f00aa236a6827a08e099d
MD5 a1dd32e5dc169766ca95a75f31d6a5eb
BLAKE2b-256 8344ff58a6c73caad106e8a5c1dfb341fb1ea6e87547863a8456d068e9b6d5f9

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