sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:postgres

问题描述 投票:0回答:8

我正在尝试使用 SQLAlchemy 连接到 Postgres 数据库。我已经安装了 psycopg2。但是,我收到错误

sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres
。如何配置 SQLAlchemy 以连接到 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)
python postgresql sqlalchemy flask-sqlalchemy psycopg2
8个回答
348
投票

URI 应该以

postgresql://
开头,而不是
postgres://
。 SQLAlchemy 曾经接受两者,但已经删除了对
postgres
名称的支持。


133
投票

SQLAlchemy 1.4 删除了已弃用的

postgres
方言名称,现在必须使用名称
postgresql
代替。方言是URL中
://
之前的部分。 SQLAlchemy 1.3 及更早版本显示弃用警告但仍接受它。

要解决此问题,请将 URL 中的

postgres://
重命名为
postgresql://
.

当前在使用 Heroku 时会出现此错误,它在他们提供的

postgres
中使用
DATABASE_URL
,您可能将其用于
SQLALCHEMY_DATABASE_URI
。要在他们更新之前解决此问题,请更新 Heroku 仪表板中的变量以使用
postgresql
.


27
投票

heroku 中的问题已通过使用简单的 python url 替换代码解决

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`

来源:https://help.heroku.com/ZKNTJQSK/why-is-sqlalchemy-1-4-x-not-connecting-to-heroku-postgres


4
投票

要解决此问题,请将 URL 中的

postgres://
重命名为
postgresql+psycopg2://
.


2
投票
# 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'

我尝试了以上所有答案,但只有这个对我有用。我遵循了 Heroku 的官方建议(在之前的评论中提到),但没有运气。我认为在

replace()
末尾取消 1 可能有所帮助。


1
投票

正如 @Kaitlin Berryman 所说,Heroku 官方答案不起作用,为避免将您的数据库凭据添加到

db.create_all()
之前:

# create the database and the db table
import os
import re

uri = os.getenv("DATABASE_URL")
# or other relevant config var
if uri.startswith("postgres://"):
    uri = uri.replace("postgres://", "postgresql://", 1)
    app.config['SQLALCHEMY_DATABASE_URI'] = uri

0
投票

我发现的所有食谱都说“使用 postresql 而不是 postgres”。但它对我不起作用,因为我的数据库前缀已经可以“postresql”了。

经过一些调查,我设法找到了问题所在。问题是“alembic.ini”包含 db url

sqlalchemy.url = driver://user:pass@localhost/dbname
的通用模板 改用
sqlalchemy.url = postgresql://user:pass@localhost/dbname
。它有效。


-1
投票

阅读@gitau-harrison 的回答并知道这是一个 SQLAlchemy 问题后,我没有更新 Heroku 仪表板中的变量以使用 postgresql,而是将“requirements.txt”中的 SQLAlchemy 版本更改为 1.3.7 (是 1.4.18),这为我解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.