Skip to content

SQLAlchemy PostgreSQL Connection Error: Fixing NoSuchModuleError

Problem Statement

When trying to connect to a PostgreSQL database using SQLAlchemy, you may encounter the error:

sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres

This commonly occurs when your database connection URI uses the outdated postgres:// prefix instead of the current postgresql:// prefix.

Common Scenario

The error often appears with code like this:

python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "postgres://username@localhost:5432/template1"

db = SQLAlchemy(app)

Root Cause

The issue stems from a change in SQLAlchemy version 1.4:

  • SQLAlchemy 1.3 and earlier: Accepted both postgres:// and postgresql:// prefixes (with deprecation warnings for postgres://)
  • SQLAlchemy 1.4 and later: Completely removed support for the deprecated postgres:// dialect name

Solutions

Simply change the protocol prefix in your database connection string:

python
# Before (causes error)
app.config["SQLALCHEMY_DATABASE_URI"] = "postgres://username:password@localhost:5432/mydatabase"

# After (works correctly)
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://username:password@localhost:5432/mydatabase"

Solution 2: Handle Heroku Database URLs Automatically

For Heroku deployments where the DATABASE_URL environment variable uses the old format:

python
import os
import re

uri = os.getenv("DATABASE_URL")
if uri and uri.startswith("postgres://"):
    uri = uri.replace("postgres://", "postgresql://", 1)
    app.config['SQLALCHEMY_DATABASE_URI'] = uri
else:
    app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///mydatabase'

Solution 3: Use Explicit Dialect Specification

You can also specify the driver explicitly:

python
# Using psycopg2 driver
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql+psycopg2://username:password@localhost:5432/mydatabase"

WARNING

Downgrading SQLAlchemy to version 1.3.x (as some older answers suggest) is not recommended as it prevents you from benefiting from security updates and new features in recent versions.

Best Practices

  1. Always use postgresql:// as the protocol prefix in your connection strings
  2. Validate environment variables before using them in production
  3. Use connection pooling for better performance in production applications

Troubleshooting Other Configuration Files

If you encounter this error in other contexts:

Alembic (alembic.ini):

ini
; Incorrect
sqlalchemy.url = postgres://user:pass@localhost/dbname

; Correct
sqlalchemy.url = postgresql://user:pass@localhost/dbname

Summary

The NoSuchModuleError occurs because SQLAlchemy 1.4+ no longer recognizes the deprecated postgres:// dialect name. The solution is to consistently use postgresql:// in all your database connection strings, whether in application code, environment variables, or configuration files.

By updating your connection strings to use the correct protocol, you'll ensure compatibility with modern SQLAlchemy versions while maintaining database connectivity.