PostgreSQL helper functions for data analysis with enterprise-grade security
Project description
PostgreSQL Helper Functions
A Python package providing robust utilities for PostgreSQL database operations, query management, and data analysis workflows with enterprise-grade security.
Features
- ๐ Automatic retry logic with exponential backoff for unreliable connections
- ๐ Seamless pandas integration for data analysis
- ๐ง SQL query templating and parameter substitution
- ๐ Cross-platform notifications when long queries complete
- โ๏ธ Environment-based configuration for secure credential management
- ๐ก๏ธ Comprehensive error handling and logging
- ๐ SSL/TLS encryption with CA certificate verification for AWS RDS and other cloud databases
- Enhanced in v1.3.2
- ๐ Flexible credential file location: Support for
CREDENTIALS_DIRandCREDENTIALS_FILEenvironment variables - ๐ Enhanced configuration: Specify custom .env file paths for different projects and environments
- ๐ข Centralized credentials: Share credential directories across multiple projects
- ๐ Flexible credential file location: Support for
- Enhanced in v1.3.1:
- ๐งช Comprehensive test suite with 40+ test cases covering all functionality
- โ Cross-platform validation ensuring reliability on Windows, macOS, and Linux
- ๐ Function name improvements for better API clarity
- Previous in v1.2.0:
- ๐ Full SSL support with optional CA certificate verification
- ๐ก๏ธ Man-in-the-middle attack prevention for production environments
- โ SSL connection testing and diagnostics
- Previous in v1.1.0:
- ๐ Advanced fallback methods for SQLAlchemy/pandas compatibility issues
- ๐ Enhanced debugging and diagnostic capabilities
What's New in Version 1.3.2 ๐งช
Flexible Credential File Configuration
- Custom credential locations: Use
CREDENTIALS_DIRandCREDENTIALS_FILEenvironment variables - Perfect for shared credentials: Point multiple projects to a centralized credential directory
- Environment-specific files: Use different credential files for dev/staging/production
- Fully backwards compatible: Existing projects continue to work without any changes
import os
# Use centralized credentials directory
os.environ['CREDENTIALS_DIR'] = r'C:\Documents\Credentials'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine() # Loads C:\Documents\Credentials\.env
# Use custom filename for database credentials
os.environ['CREDENTIALS_FILE'] = '.env.database'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine() # Loads ./.env.database
# Combine both for full flexibility
os.environ['CREDENTIALS_DIR'] = r'C:\Documents\Project\Assets'
os.environ['CREDENTIALS_FILE'] = '.env.production'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine() # Loads C:\Documents\Project\Assets\.env.production
Installation
From Source (Development)
git clone https://github.com/yourusername/pg_helpers.git
cd pg_helpers
pip install -e .
From GitHub (Specific Version)
pip install git+https://github.com/yourusername/pg_helpers.git@v1.3.2
Dependencies
pip install pandas psycopg2-binary sqlalchemy python-dotenv
Quick Start
1. Environment Setup
Create a .env file in your project root (NOT in this repository):
# Required database credentials
DB_USER=your_username
DB_PASSWORD=your_password
DB_HOST=your_host
DB_PORT=5432
DB_NAME=your_database
# SSL Configuration (optional)
# SSL Mode options: disable, allow, prefer, require, verify-ca, verify-full
DB_SSL_MODE=require
# Optional: Path to CA certificate for maximum security
# DB_SSL_CA_CERT=/path/to/rds-ca-2019-root.pem
# For AWS RDS with maximum security:
# DB_SSL_MODE=verify-full
# DB_SSL_CA_CERT=./certs/rds-ca-2019-root.pem
Flexible Credential Location Setup NEW in v1.3.2
You can now specify custom locations for your credential files using environment variables:
Option 1: Centralized credential directory
import os
# Point to a shared credentials folder
os.environ['CREDENTIALS_DIR'] = r'C:\Users\Me\Documents\Credentials'
# Will load: C:\Users\Me\Documents\Credentials\.env
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine()
Option 2: Custom credential filename
import os
# Use a specific credential file name in current directory
os.environ['CREDENTIALS_FILE'] = '.env.database'
# Will load: ./.env.database
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine()
Option 3: Both custom directory and filename
import os
# Full custom path
os.environ['CREDENTIALS_DIR'] = r'C:\Documents\Project\Assets'
os.environ['CREDENTIALS_FILE'] = '.env.production'
# Will load: C:\Documents\Project\Assets\.env.production
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine()
Configuration Priority:
- Both
CREDENTIALS_DIRandCREDENTIALS_FILEset โ{CREDENTIALS_DIR}/{CREDENTIALS_FILE} - Only
CREDENTIALS_DIRset โ{CREDENTIALS_DIR}/.env - Only
CREDENTIALS_FILEset โ./{CREDENTIALS_FILE} - Neither set (default) โ
./.env
Benefits of flexible credentials:
- ๐ Centralized security: Keep all credentials in one secure location
- ๐ข Team workflows: Share credential directories across team members
- ๐ Environment-specific: Use
.env.production,.env.staging,.env.dev - ๐ Multi-project: Reuse credentials across multiple analysis projects
- โ Backwards compatible: Existing code works without changes
2. Basic Usage
from pg_helpers import createPostgresqlEngine, dataGrabber, queryCleaner, check_ssl_connection
# Create secure database connection (uses SSL by default)
engine = createPostgresqlEngine()
# Verify SSL connection
ssl_info = check_ssl_connection(engine)
print(f"SSL Active: {ssl_info.get('ssl_active', 'Unknown')}")
# Execute a simple query
data = dataGrabber("SELECT * FROM users LIMIT 10", engine)
print(data.head())
# Enable debugging for troubleshooting
data = dataGrabber("SELECT * FROM complex_view", engine, debug=True)
# Use query templates
query = queryCleaner(
'queries/user_analysis.sql',
list1=[100, 200, 300],
varString1='$USER_IDS',
startDate='2023-01-01',
endDate='2023-12-31'
)
results = dataGrabber(query, engine)
3. Custom SSL Configuration
from pg_helpers import createPostgresqlEngineWithCustomSSL
# Maximum security for production
engine = createPostgresqlEngineWithCustomSSL(
ssl_ca_cert="/path/to/rds-ca-2019-root.pem",
ssl_mode="verify-full"
)
# Basic SSL without certificate verification
engine = createPostgresqlEngineWithCustomSSL(
ssl_mode="require"
)
# Disable SSL (not recommended for production)
engine = createPostgresqlEngineWithCustomSSL(
ssl_mode="disable"
)
Function Reference
Database Operations
createPostgresqlEngine()
Creates a SQLAlchemy engine for PostgreSQL connections using environment variables with SSL support.
Returns: sqlalchemy.Engine
Environment variables:
- Required:
DB_USER,DB_PASSWORD,DB_HOST,DB_NAME - Optional:
DB_PORT(default: 5432) - SSL Options:
DB_SSL_MODE(default: "require")DB_SSL_CA_CERT(path to CA certificate)DB_SSL_CERT(client certificate)DB_SSL_KEY(client key)
createPostgresqlEngineWithCustomSSL(ssl_ca_cert=None, ssl_mode='require', ssl_cert=None, ssl_key=None) v1.2.0
Creates a SQLAlchemy engine with custom SSL configuration, overriding environment variables.
Parameters:
ssl_ca_cert(str, optional): Path to CA certificate filessl_mode(str): SSL mode - "disable", "allow", "prefer", "require", "verify-ca", "verify-full"ssl_cert(str, optional): Path to client certificate filessl_key(str, optional): Path to client key file
Returns: sqlalchemy.Engine
SSL Modes Explained:
disable: No SSL connectionallow: Try SSL, fallback to non-SSLprefer: Try SSL first, fallback to non-SSLrequire: Default - Require SSL, fail if unavailableverify-ca: Require SSL and verify server certificateverify-full: Most secure - Require SSL, verify certificate and hostname
check_ssl_connection(engine=None) v1.2.0, improved v1.3.0
Tests SSL connection and displays SSL information. (Renamed from test_ssl_connection in v1.3.0 for API clarity)
Parameters:
engine(optional): SQLAlchemy engine (creates one if not provided)
Returns: dict with SSL connection details including:
ssl_active: Whether SSL is activessl_cipher: Encryption cipher usedssl_version: SSL/TLS versionclient_cert_present: Whether client certificate is present
dataGrabber(query, engine, limit='None', debug=False) ENHANCED in v1.1.0
Executes SQL queries and returns pandas DataFrames with robust error handling.
Parameters:
query(str): SQL query to executeengine: SQLAlchemy enginelimit(str, optional): Row limit for resultsdebug(bool, optional): Enable detailed logging and debugging output
Returns: pandas.DataFrame
Features:
- Multiple fallback methods for compatibility issues
- Automatic detection and handling of metadata interpretation errors
- Comprehensive error logging and debugging
- Execution timing display
- Cross-platform sound notifications
- Automatic error propagation for retry logic
recursiveDataGrabber(query_dict, results_dict, n=1, max_attempts=50)
Executes multiple queries with automatic retry and exponential backoff.
Parameters:
query_dict(dict): Dictionary of {query_name: sql_string}results_dict(dict): Dictionary to store resultsn(int): Current attempt numbermax_attempts(int): Maximum retry attempts
Returns: dict with DataFrames or None for failed queries
Use case: Perfect for running multiple large queries overnight with unreliable connections.
diagnose_connection_and_query(engine, query, limit=10) ENHANCED in v1.1.0
Diagnostic function to help troubleshoot SQLAlchemy/pandas compatibility issues.
Parameters:
engine: SQLAlchemy enginequery(str): SQL query to diagnoselimit(int): Number of rows to test with
Returns: dict with diagnostic information
Query Utilities
queryCleaner(file, list1='empty', varString1='empty', ...)
Loads SQL files and substitutes parameters for dynamic queries.
Parameters:
file(str): Path to SQL filelist1: List to substitute (converts to comma-separated string)varString1(str): Placeholder string in SQL filestartDate/endDate: Date range parameters
Returns: str - Processed SQL query
listPrep(iList)
Converts Python lists to SQL-compatible comma-separated strings.
Parameters:
iList: List of integers, floats, strings, or single value
Returns: str - SQL-formatted string
Testing and Quality Assurance NEW in v1.3.0
Running Tests
The package includes a comprehensive test suite with 40+ test cases covering all functionality:
# Install test dependencies
pip install pytest pytest-cov
# Run all tests
python -m pytest tests/ -v
# Run tests with coverage report
python -m pytest tests/ --cov=pg_helpers --cov-report=html --cov-report=term-missing
# Run specific test categories
python -m pytest tests/test_database.py::TestQueryUtils -v # Query utilities
python -m pytest tests/test_database.py::TestConfig -v # Configuration
python -m pytest tests/test_database.py::TestDatabase -v # Database operations
python -m pytest tests/test_database.py::TestNotifications -v # Cross-platform notifications
What the Tests Validate
Core Functionality Tests
- โ Database engine creation with various SSL configurations
- โ Query execution with multiple fallback methods
- โ SSL connection testing and diagnostics
- โ Configuration validation and environment variable handling
- โ Query template processing with parameter substitution
- โ Error handling for network issues and compatibility problems
Cross-Platform Compatibility
- โ File operations on Windows, macOS, and Linux
- โ Sound notifications across different operating systems
- โ Environment variable handling with different shell environments
- โ Temporary file management and cleanup
Error Condition Testing
- โ Missing environment variables and configuration errors
- โ SSL certificate validation failures and missing files
- โ Database connection failures and retry logic
- โ Pandas/SQLAlchemy compatibility issues and fallback methods
- โ Invalid query parameters and malformed SQL
Integration Testing
- โ End-to-end workflows combining multiple functions
- โ Configuration to engine creation pipelines
- โ Query templating to execution workflows
Test Output Example
================================================= test session starts =================================================
platform win32 -- Python 3.12.9, pytest-8.4.1, pluggy-1.5.0
collected 40 items
tests/test_database.py::TestQueryUtils::test_listPrep_empty_list PASSED [ 2%]
tests/test_database.py::TestQueryUtils::test_listPrep_floats PASSED [ 5%]
tests/test_database.py::TestQueryUtils::test_listPrep_integers PASSED [ 7%]
tests/test_database.py::TestQueryUtils::test_listPrep_single_value PASSED [ 10%]
tests/test_database.py::TestQueryUtils::test_listPrep_strings PASSED [ 12%]
... (34 more tests) ...
tests/test_database.py::TestNotifications::test_play_notification_sound_windows PASSED [100%]
================================================= 40 passed in 1.03s ==================================================
Flexible Credential File Configuration NEW in v1.3.2
- Custom credential locations: Use
CREDENTIALS_DIRandCREDENTIALS_FILEenvironment variables - Perfect for shared credentials: Point multiple projects to a centralized credential directory
- Environment-specific files: Use different credential files for dev/staging/production
- Fully backwards compatible: Existing projects continue to work without any changes
import os
# Use centralized credentials directory
os.environ['CREDENTIALS_DIR'] = r'C:\Documents\Credentials'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine() # Loads C:\Documents\Credentials\.env
# Use custom filename for database credentials
os.environ['CREDENTIALS_FILE'] = '.env.database'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine() # Loads ./.env.database
# Combine both for full flexibility
os.environ['CREDENTIALS_DIR'] = r'C:\Documents\Project\Assets'
os.environ['CREDENTIALS_FILE'] = '.env.production'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine() # Loads C:\Documents\Project\Assets\.env.production
Continuous Integration Setup NEW in v1.3.0
For automated testing across multiple environments, add this GitHub Actions workflow:
# .github/workflows/test.yml
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: [3.8, 3.9, "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest pytest-cov
pip install -e .
- name: Run tests
run: python -m pytest tests/ -v --tb=short
Test Coverage Goals
- Target Coverage: >90% (currently achieved)
- Critical Functions: 100% coverage for database operations
- Error Paths: All exception handling paths tested
- Edge Cases: Empty lists, missing files, invalid configurations
Advanced Usage
SSL Security Configuration v1.2.0
For AWS RDS (Recommended)
from pg_helpers import createPostgresqlEngineWithCustomSSL, check_ssl_connection
# Download RDS CA certificate first
# wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
# Maximum security configuration
engine = createPostgresqlEngineWithCustomSSL(
ssl_ca_cert="./certs/rds-ca-2019-root.pem",
ssl_mode="verify-full"
)
# Test the secure connection
ssl_info = check_ssl_connection(engine)
print(f"SSL Cipher: {ssl_info.get('ssl_cipher')}")
print(f"SSL Version: {ssl_info.get('ssl_version')}")
Environment-based SSL Configuration
# Set in .env file:
# DB_SSL_MODE=verify-full
# DB_SSL_CA_CERT=./certs/rds-ca-2019-root.pem
from pg_helpers import createPostgresqlEngine, check_ssl_connection
# Uses environment variables
engine = createPostgresqlEngine()
# Verify security
ssl_info = check_ssl_connection(engine)
if ssl_info.get('ssl_active'):
print("โ
Secure SSL connection established")
else:
print("โ ๏ธ SSL not active - check configuration")
SSL Mode Comparison
# Different security levels for different environments
# Development (basic encryption)
dev_engine = createPostgresqlEngineWithCustomSSL(ssl_mode="require")
# Staging (certificate verification)
staging_engine = createPostgresqlEngineWithCustomSSL(
ssl_mode="verify-ca",
ssl_ca_cert="./certs/staging-ca.pem"
)
# Production (maximum security)
prod_engine = createPostgresqlEngineWithCustomSSL(
ssl_mode="verify-full",
ssl_ca_cert="./certs/rds-ca-2019-root.pem"
)
Debugging and Troubleshooting
from pg_helpers import createPostgresqlEngine, dataGrabber, diagnose_connection_and_query
engine = createPostgresqlEngine()
# Enable detailed debugging for problematic queries
data = dataGrabber("""
SELECT * FROM complex_view
WHERE date_column > '2023-01-01'
""", engine, debug=True)
# Diagnose specific issues
diagnostics = diagnose_connection_and_query(engine, "SELECT * FROM problematic_table")
print(f"Engine info: {diagnostics['engine_info']}")
print(f"Test results: {diagnostics['test_results']}")
print(f"Recommendations: {diagnostics['recommendations']}")
Batch Query Processing
from pg_helpers import recursiveDataGrabber, queryCleaner
# Prepare multiple queries
queries = {
'user_stats': queryCleaner('sql/user_stats.sql', startDate='2023-01-01'),
'sales_data': queryCleaner('sql/sales.sql', list1=[1,2,3], varString1='$REGIONS'),
'inventory': 'SELECT * FROM inventory WHERE status = "active"'
}
# Execute with automatic retry
results = {}
final_results = recursiveDataGrabber(queries, results)
# Access individual results
user_df = final_results['user_stats']
sales_df = final_results['sales_data']
Credential Management Strategies NEW in v1.3.2
Strategy 1: Centralized Credentials for Multiple Projects
Keep one credential directory for all your projects:
C:\Users\Me\Documents\Credentials\
โโโ .env # General/shared credentials
โโโ .env.database # Database-specific credentials
โโโ .env.api # API credentials
โโโ .env.production # Production environment
Project1\
โโโ analysis.py
โโโ (no .env file needed)
Project2\
โโโ dashboard.py
โโโ (no .env file needed)
Setup in each project:
import os
os.environ['CREDENTIALS_DIR'] = r'C:\Users\Me\Documents\Credentials'
os.environ['CREDENTIALS_FILE'] = '.env.database'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine()
Strategy 2: Environment-Specific Credentials
Use different credential files for different environments:
import os
# Detect environment (from ENV variable, config file, etc.)
environment = os.getenv('APP_ENV', 'development')
# Set credential file based on environment
os.environ['CREDENTIALS_DIR'] = r'C:\Documents\Credentials'
os.environ['CREDENTIALS_FILE'] = f'.env.{environment}'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine()
# Loads .env.development, .env.staging, or .env.production
Strategy 3: Project-Specific Overrides
Use centralized credentials with project-specific overrides:
import os
from pathlib import Path
# Try project-local first, fall back to centralized
if Path('.env.local').exists():
os.environ['CREDENTIALS_FILE'] = '.env.local'
else:
os.environ['CREDENTIALS_DIR'] = r'C:\Documents\Credentials'
os.environ['CREDENTIALS_FILE'] = '.env.database'
from pg_helpers import createPostgresqlEngine
engine = createPostgresqlEngine()
Best Practices for Credential Files
Security:
- โ Store credential directories outside of project repositories
- โ
Use restrictive file permissions (e.g.,
chmod 600on Linux/macOS) - โ Never commit credential file paths to version control
- โ Document credential file locations in team wikis, not in code
Organization:
- ๐ Use descriptive filenames:
.env.database,.env.api,.env.aws - ๐ Group by environment:
.env.production,.env.staging - ๐ Keep a
.env.templatein your repository with dummy values
Team Workflows:
# config.py (committed to repository)
import os
from pathlib import Path
def setup_credentials():
"""Load credentials from standard team location or local override"""
# Check for local override first (for development)
if Path('.env.local').exists():
os.environ['CREDENTIALS_FILE'] = '.env.local'
return
# Use team shared credentials location
team_creds = Path.home() / 'TeamShared' / 'Credentials'
if team_creds.exists():
os.environ['CREDENTIALS_DIR'] = str(team_creds)
os.environ['CREDENTIALS_FILE'] = '.env.database'
return
# Fallback to default behavior
print("โ ๏ธ No credentials found - using .env in current directory")
# Call this before importing pg_helpers
setup_credentials()
## Security Best Practices
### SSL/TLS Configuration
- **Always use SSL in production** - Set `DB_SSL_MODE=require` minimum
- **Use CA certificate verification** for cloud databases (AWS RDS, GCP Cloud SQL)
- **Download official CA certificates** from your cloud provider
- **Use `verify-full` mode** for maximum security in production
- **Test SSL connections** regularly with `check_ssl_connection()`
### AWS RDS Security Setup
```bash
# Download AWS RDS CA certificate
mkdir -p ./certs
wget -O ./certs/rds-ca-2019-root.pem \
https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
# Set environment variables
echo "DB_SSL_MODE=verify-full" >> .env
echo "DB_SSL_CA_CERT=./certs/rds-ca-2019-root.pem" >> .env
General Security
- Never commit
.envfiles - add to.gitignore - Use environment variables for all credentials
- Rotate database passwords regularly
- Use database connection pooling for production
- Monitor SSL certificate expiration dates
File Structure for Your Projects
your_project/
โโโ .env # Database credentials (DO NOT COMMIT)
โโโ .gitignore # Include .env and certs/
โโโ main.py # Your analysis code
โโโ certs/ # SSL certificates (DO NOT COMMIT private keys)
โ โโโ rds-ca-2019-root.pem
โ โโโ custom-ca.pem
โโโ queries/ # SQL template files
โ โโโ user_analysis.sql
โ โโโ sales_report.sql
โ โโโ inventory.sql
โโโ data/ # Output data files
โ โโโ results.pkl
โโโ tests/ # Test files (if contributing)
โโโ test_database.py
Troubleshooting
Common Issues
SSL certificate verification failed
- Ensure CA certificate file exists and is readable
- Download the latest CA certificate from your provider
- Check that
ssl_modeis set correctly - Use
check_ssl_connection()to diagnose SSL issues
"SSL connection required"
- Check that your database server supports SSL
- Verify
DB_SSL_MODEis set correctly - For development, you can temporarily use
ssl_mode="disable"
"Missing required environment variables"
- Ensure
.envfile exists in your project root - Check that all required variables are set:
DB_USER,DB_PASSWORD,DB_HOST,DB_NAME
Connection timeouts
- The
recursiveDataGrabberwill automatically retry with exponential backoff - Check network connectivity and database server status
- Consider increasing
max_attemptsfor very unreliable connections
SQLAlchemy/pandas compatibility errors IMPROVED in v1.1.0
- The package now automatically handles most compatibility issues
- Enable
debug=Trueto see which fallback method succeeds - Use
diagnose_connection_and_query()for detailed troubleshooting
"immutabledict" or metadata interpretation errors FIXED in v1.1.0
- These errors are now automatically detected and handled
- The package will try alternative pandas parameters and manual DataFrame construction
- No action needed from users - fallback methods handle this automatically
Sound notifications not working
- This is normal and won't affect functionality
- Ensure system sound is enabled
- On Linux, you may need to install additional audio packages
Test failures during development NEW in v1.3.0
- Ensure all dependencies are installed:
pip install pytest pytest-cov - Check that you're running tests from the project root directory
- Use
python -m pytest tests/ -vfor detailed output - Some tests require write access to temporary directories
Changelog
Version 1.3.2 (Current) ๐
- ๐ Flexible credential file location: Support for
CREDENTIALS_DIRandCREDENTIALS_FILEenvironment variables - ๐ Enhanced configuration: Specify custom .env file paths for different projects and environments
- ๐ข Centralized credentials: Share credential directories across multiple projects
- ๐ Environment-specific files: Easy support for .env.production, .env.staging, .env.dev
- โ
Backwards compatible: Defaults to
.envin current directory when no variables set - ๐ Documentation: New credential management strategies and best practices guide
Version 1.3.1
- ๐งช Comprehensive test suite: 40+ test cases with >90% code coverage
- โ Cross-platform validation: Tests confirm functionality on Windows, macOS, and Linux
- ๐ง API improvements:
test_ssl_connection()renamed tocheck_ssl_connection()for clarity - ๐ CI/CD ready: GitHub Actions workflow for automated testing across environments
- ๐ Enhanced documentation: Detailed testing guide and troubleshooting section
- ๐ก๏ธ Quality assurance: All functions tested including error conditions and edge cases
Version 1.2.0
- ๐ SSL/TLS support: Full SSL encryption with optional CA certificate verification
- ๐ก๏ธ Security enhancements: Man-in-the-middle attack prevention for production environments
- โ SSL testing: New SSL connection diagnostics
- ๐ง Custom SSL configuration: Programmatic SSL parameter override
- ๐ Environment SSL config: Optional SSL settings via environment variables
- ๐ Backward compatibility: Existing code continues to work without changes
Version 1.1.0
- โจ Enhanced error handling: Multiple fallback methods for pandas/SQLAlchemy compatibility
- ๐ Improved debugging: Comprehensive logging and diagnostic capabilities
- ๐ ๏ธ Better reliability: Automatic detection and handling of metadata interpretation errors
- ๐ Manual DataFrame construction: Fallback method for complex data type issues
- ๐ง Alternative parameter testing: Tries different pandas configurations automatically
Version 1.0.0
- Initial release with core functionality
- Basic retry logic and PostgreSQL integration
- Query templating and notification system
Contributing
- Fork the repository
- Create a feature branch:
git checkout -b feature-name - Add tests for new functionality:
python -m pytest tests/ -v - Ensure all tests pass and maintain >90% coverage
- Run the full test suite:
python -m pytest tests/ --cov=pg_helpers - Submit a pull request
Development Setup
git clone https://github.com/yourusername/pg_helpers.git
cd pg_helpers
pip install -e .
pip install pytest pytest-cov
python -m pytest tests/ -v
License
MIT License - feel free to use in your projects!
Author
Chris Leonard
This package was designed for data analysts and engineers who work with PostgreSQL databases and need reliable, automated query execution with enterprise-grade security. Version 1.3.2 adds flexible credential management while ensuring this reliability through comprehensive testing across multiple platforms and Python versions.
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 pg_helpers-1.3.2.tar.gz.
File metadata
- Download URL: pg_helpers-1.3.2.tar.gz
- Upload date:
- Size: 33.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ba3b2a76a41e4cbffe9cb608d037721ad385cbdbe492cce5628b074c5aa8c66
|
|
| MD5 |
5e738b006de742207b670bf29f4e0dba
|
|
| BLAKE2b-256 |
cb054a402a6c054feaa2306d6ba75f421e968ef86004836e844a7669ce017d96
|
File details
Details for the file pg_helpers-1.3.2-py3-none-any.whl.
File metadata
- Download URL: pg_helpers-1.3.2-py3-none-any.whl
- Upload date:
- Size: 25.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8821e3f0674d357667cc174ebd7b1348952121ca13cff4a91f45697fd9dbbbe5
|
|
| MD5 |
0aa954024883e54d2a110a5163438e61
|
|
| BLAKE2b-256 |
cca93d552bd4b6ff12e675f73ef96b85158b5e2fa02a23158134737f423bc0db
|