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_countfor 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aurora_to_rs-0.1.8.tar.gz.
File metadata
- Download URL: aurora_to_rs-0.1.8.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7adcbf1935930d5dd4b079bf5922659e7197f1141bbfeedd82f81d1e755a89d
|
|
| MD5 |
de0ad20c285521c6bced3c83e5f5b43c
|
|
| BLAKE2b-256 |
ca8a5992734ae57aede00d0772749d02f7c601530e85ff22e3236fd8ba9e1813
|
File details
Details for the file aurora_to_rs-0.1.8-py3-none-any.whl.
File metadata
- Download URL: aurora_to_rs-0.1.8-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b84635c53c387eee1948ad7364ba8ce40031560cad744c6635c781e767c2c26
|
|
| MD5 |
6f8aa063510cbc161fe3b9fe8df903f1
|
|
| BLAKE2b-256 |
4979b5bb281d755522717b7e6fee34af8d88e7cdcf56612e53a0c684fb717a6c
|