'sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres
I'm trying to connect to a Postgres database with SQLAlchemy. I've installed psycopg2. However, I get the error sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres
. How do I configure SQLAlchemy to connect to PostgreSQL?
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)
Solution 1:[1]
The URI should start with postgresql://
instead of postgres://
. SQLAlchemy used to accept both, but has removed support for the postgres
name.
Solution 2:[2]
SQLAlchemy 1.4 removed the deprecated postgres
dialect name, the name postgresql
must be used instead now. The dialect is the part before the ://
in the URL. SQLAlchemy 1.3 and earlier showed a deprecation warning but still accepted it.
To fix this, rename postgres://
in the URL to postgresql://
.
This error currently shows up when working with Heroku, which uses postgres
in the DATABASE_URL
they provide, which you probably use for SQLALCHEMY_DATABASE_URI
. To work around this until they update it, update the variable in the Heroku dashboard to use postgresql
.
Solution 3:[3]
The problem in heroku have been resolved by using simple python url replace code
import os
import re
uri = os.getenv("DATABASE_URL") # or other relevant config var
if uri and uri.startswith("postgres://"):
uri = uri.replace("postgres://", "postgresql://", 1)
# rest of connection code using the connection string `uri`
source : https://help.heroku.com/ZKNTJQSK/why-is-sqlalchemy-1-4-x-not-connecting-to-heroku-postgres
Solution 4:[4]
# production or dev DB
try:
prodURI = os.getenv('DATABASE_URL')
prodURI = prodURI.replace("postgres://", "postgresql://")
app.config['SQLALCHEMY_DATABASE_URI'] = prodURI
except:
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///MYDATABASE'
I tried all the above answers, but only this worked for me. I followed Heroku's official suggestion (mentioned in previous comments), but no luck. I think taking off the 1 at the end of replace()
may have helped.
Solution 5:[5]
To fix this, rename postgres://
in the URL to postgresql+psycopg2://
.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | davidism |
Solution 2 | davidism |
Solution 3 | davidism |
Solution 4 | Kaitlin Berryman |
Solution 5 |