{"id":693,"library":"redshift-connector","title":"Amazon Redshift Python Connector","description":"redshift-connector is the official Amazon Redshift connector for Python, implementing the Python Database API Specification 2.0. It provides easy integration with data science libraries like pandas and numpy, and supports Redshift-specific features such as IAM and Identity Provider (IdP) authentication. The library is actively maintained with frequent minor releases, currently at version 2.1.12.","status":"active","version":"2.1.12","language":"python","source_language":"en","source_url":"https://github.com/aws/amazon-redshift-python-driver","tags":["aws","redshift","database","sql","connector","data-warehousing"],"install":[{"cmd":"pip install redshift-connector","lang":"bash","label":"Basic Installation"},{"cmd":"pip install redshift-connector[full]","lang":"bash","label":"With Data Science Integrations (pandas, numpy)"}],"dependencies":[{"reason":"Requires Python 3.6 or newer.","package":"python","optional":false},{"reason":"Optional, for integration with pandas DataFrames.","package":"pandas","optional":true},{"reason":"Optional, for integration with NumPy arrays.","package":"numpy","optional":true}],"imports":[{"note":"The common module name to import is `redshift_connector`.","symbol":"redshift_connector","correct":"import redshift_connector"}],"quickstart":{"code":"import redshift_connector\nimport os\n\ntry:\n    # Connect to Redshift cluster using environment variables for credentials\n    conn = redshift_connector.connect(\n        host=os.environ.get('REDSHIFT_HOST', 'your-redshift-cluster.example.com'),\n        database=os.environ.get('REDSHIFT_DB', 'dev'),\n        port=int(os.environ.get('REDSHIFT_PORT', '5439')),\n        user=os.environ.get('REDSHIFT_USER', 'awsuser'),\n        password=os.environ.get('REDSHIFT_PASSWORD', 'your_password_here')\n    )\n\n    # Create a Cursor object\n    cursor = conn.cursor()\n\n    # Execute a query\n    cursor.execute(\"SELECT 1 as id, 'Hello, Redshift!' as message;\")\n\n    # Retrieve the query result set\n    result = cursor.fetchall()\n    print(\"Query Result:\", result)\n\n    # Close the cursor and connection\n    cursor.close()\n    conn.close()\n\nexcept Exception as e:\n    print(f\"An error occurred: {e}\")","lang":"python","description":"This quickstart demonstrates how to connect to an Amazon Redshift cluster, create a cursor, execute a simple SQL query, fetch the results, and then close the connection. It's recommended to use environment variables for sensitive credentials."},"warnings":[{"fix":"Upgrade to `redshift-connector` version 2.1.7 or later to address this issue.","message":"A security vulnerability (CVE-2025-5279) existed in versions 2.0.872 through 2.1.6, where the `BrowserAzureOAuth2CredentialsProvider` plugin skipped SSL certificate validation for the Identity Provider (IdP). This could allow an actor to intercept token exchange.","severity":"breaking","affected_versions":">=2.0.872, <=2.1.6"},{"fix":"Set `conn.autocommit = True` after connecting, or explicitly call `conn.commit()` after executing statements that modify data.","message":"Autocommit is `OFF` by default, adhering to the Python DB-API specification. Transactions must be explicitly committed for changes to persist.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Ensure Redshift cluster security groups and network ACLs allow inbound/outbound traffic on the Redshift port (default 5439). Increase client system TCP/IP timeout values for long-running queries or idle connections.","message":"Network connectivity issues, including timeouts, are common, especially when connecting from outside an Amazon EC2 instance or running long-duration queries. This can be due to firewall rules, VPC configurations, or client-side TCP/IP timeout settings.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Strongly prefer using the `COPY` command with Amazon S3 staging for bulk data loads. The `redshift-connector` supports this method.","message":"For loading large amounts of data into Redshift, using individual `INSERT` statements can be prohibitively slow and expensive.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Migrate existing Python UDFs to alternative solutions before June 30, 2026. For new functionality, consider SQL UDFs or other data processing patterns.","message":"Amazon Redshift is ending support for creating new Python User-Defined Functions (UDFs) starting with Patch 198. Existing Python UDFs will continue to function but will be fully unsupported after June 30, 2026.","severity":"deprecated","affected_versions":"Redshift clusters on Patch 198 onwards; existing UDFs after June 30, 2026"}],"env_vars":null,"last_verified":"2026-05-12T17:54:17.346Z","next_check":"2026-06-26T00:00:00.000Z","problems":[{"fix":"pip install redshift-connector","cause":"The 'redshift-connector' package is not installed in the Python environment where the script is being executed.","error":"ModuleNotFoundError: No module named 'redshift_connector'"},{"fix":"Ensure the host, port, user, password, and database parameters passed to redshift_connector.connect() are correct, and verify network access (security groups, NACLs) to the Redshift cluster from your environment.","cause":"The Redshift cluster is unreachable, likely due to incorrect host/port in the connection string, network configuration, or firewall rules blocking access.","error":"redshift_connector.Error.OperationalError: could not connect to server: Connection refused"},{"fix":"Verify the username and password used in the redshift_connector.connect() call are correct and that the user has appropriate permissions in Redshift.","cause":"The provided username or password for connecting to Redshift is incorrect, or the specified user lacks the necessary database permissions.","error":"redshift_connector.Error.DatabaseError: FATAL: password authentication failed for user \"your_user\""},{"fix":"Ensure your AWS credentials are valid and correctly configured for IAM authentication with redshift_connector.connect(), and confirm the IAM role has 'redshift:GetClusterCredentials' permission.","cause":"The AWS IAM credentials used for authentication are invalid, expired, or the associated IAM role lacks the 'redshift:GetClusterCredentials' permission.","error":"redshift_connector.Error.DatabaseError: InvalidToken"},{"fix":"Verify the Redshift cluster's hostname and port. Ensure your security groups, network ACLs, and local firewalls allow outbound connections to the Redshift cluster on the specified port.","cause":"The Python environment cannot establish a network connection to the specified Redshift host and port, often due to incorrect host/port, network configuration, or firewall rules.","error":"OperationalError: Could not connect to host=..., port=...: connection timeout"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":80,"quickstart_tag":"verified","pypi_latest":"2.1.13","install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.93,"mem_mb":17.7,"disk_size":"72.5M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.85,"mem_mb":17.7,"disk_size":"215.7M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.83,"mem_mb":17.7,"disk_size":"72.1M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.81,"mem_mb":17.7,"disk_size":"215.2M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":6.3,"import_time_s":0.67,"mem_mb":17.7,"disk_size":"73M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":12,"import_time_s":0.65,"mem_mb":17.7,"disk_size":"208M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.61,"mem_mb":17.7,"disk_size":"73M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.6,"mem_mb":17.7,"disk_size":"208M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":1.03,"mem_mb":20.1,"disk_size":"76.4M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":1.04,"mem_mb":20.1,"disk_size":"232.9M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.17,"mem_mb":20.1,"disk_size":"75.9M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.16,"mem_mb":20.1,"disk_size":"232.4M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":5.7,"import_time_s":1.01,"mem_mb":20.1,"disk_size":"77M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":11.4,"import_time_s":1.02,"mem_mb":20.1,"disk_size":"225M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.89,"mem_mb":20.1,"disk_size":"76M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.9,"mem_mb":20.1,"disk_size":"224M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":1.05,"mem_mb":19.7,"disk_size":"76.8M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":1.04,"mem_mb":19.7,"disk_size":"226.8M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.04,"mem_mb":19.6,"disk_size":"76.4M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.02,"mem_mb":19.6,"disk_size":"226.3M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":5.9,"import_time_s":1.07,"mem_mb":19.7,"disk_size":"77M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":11.7,"import_time_s":1.03,"mem_mb":19.7,"disk_size":"219M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.02,"mem_mb":19.6,"disk_size":"77M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.01,"mem_mb":19.6,"disk_size":"218M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.93,"mem_mb":20.2,"disk_size":"76.5M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.89,"mem_mb":20.2,"disk_size":"225.8M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.01,"mem_mb":20.2,"disk_size":"76.0M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1,"mem_mb":20.2,"disk_size":"225.1M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":5.5,"import_time_s":0.94,"mem_mb":20.2,"disk_size":"77M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":11.1,"import_time_s":0.86,"mem_mb":20.2,"disk_size":"218M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.03,"mem_mb":20.2,"disk_size":"76M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1,"mem_mb":20.2,"disk_size":"217M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.73,"mem_mb":17.3,"disk_size":"71.7M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.76,"mem_mb":17.3,"disk_size":"223.1M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.74,"mem_mb":17.3,"disk_size":"71.4M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.77,"mem_mb":17.3,"disk_size":"222.9M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":7.1,"import_time_s":0.7,"mem_mb":17.3,"disk_size":"72M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":14.3,"import_time_s":0.66,"mem_mb":17.3,"disk_size":"218M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.64,"mem_mb":17.3,"disk_size":"72M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.61,"mem_mb":17.3,"disk_size":"218M"}]},"quickstart_checks":{"last_tested":"2026-04-24","tag":"verified","tag_description":"quickstart runs on critical runtimes, recently tested","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}