我正在尝试使用 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)
URI 应该以
postgresql://
开头,而不是postgres://
。 SQLAlchemy 曾经接受两者,但已经删除了对 postgres
名称的支持。
SQLAlchemy 1.4 删除了已弃用的
postgres
方言名称,现在必须使用名称 postgresql
代替。方言是URL中://
之前的部分。 SQLAlchemy 1.3 及更早版本显示弃用警告但仍接受它。
要解决此问题,请将 URL 中的
postgres://
重命名为 postgresql://
.
当前在使用 Heroku 时会出现此错误,它在他们提供的
postgres
中使用 DATABASE_URL
,您可能将其用于 SQLALCHEMY_DATABASE_URI
。要在他们更新之前解决此问题,请更新 Heroku 仪表板中的变量以使用 postgresql
.
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
要解决此问题,请将 URL 中的
postgres://
重命名为 postgresql+psycopg2://
.
# 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 可能有所帮助。
正如 @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
我发现的所有食谱都说“使用 postresql 而不是 postgres”。但它对我不起作用,因为我的数据库前缀已经可以“postresql”了。
经过一些调查,我设法找到了问题所在。问题是“alembic.ini”包含 db url
sqlalchemy.url = driver://user:pass@localhost/dbname
的通用模板
改用sqlalchemy.url = postgresql://user:pass@localhost/dbname
。它有效。
阅读@gitau-harrison 的回答并知道这是一个 SQLAlchemy 问题后,我没有更新 Heroku 仪表板中的变量以使用 postgresql,而是将“requirements.txt”中的 SQLAlchemy 版本更改为 1.3.7 (是 1.4.18),这为我解决了这个问题。