烧瓶& Alchemy - (psycopg2.OperationalError)致命:密码验证失败

时间:2017-04-27 11:58:26

标签: postgresql python-3.x flask-sqlalchemy

我是python的新手。我必须使用PostgreSQL作为数据库开发一个简单的Flask应用程序(在我的本地Ubuntu 16.4中)。

我安装了pgadmin,Flask,SQLAlchemy和postgres,这也是我的应用代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://dbUserName:userNamePassword@localhost/dbName'

db = SQLAlchemy(app)
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

@app.route('/')

def index():
    return "Hello Flask"


if __name__ == "__main__":
    app.run()

另外我在pgAdmin中创建了一个数据库和新用户(并在我的代码中用相关变量替换它们),但是当我尝试在python shell中测试这段代码时,我发现错误。

我的python代码:

from app import db

结果:

/home/user/point2map2/venv/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:839: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '

然后:

db.create_all() 

结果:

(psycopg2.OperationalError) FATAL:  password authentication failed for user "dbUserName"
FATAL:  password authentication failed for user "dbUserName"

在论坛中进行了大量搜索之后,我找到了这个指南:

  

在你的pg_hba.conf

# IPv4 local connections:
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    all         all         127.0.0.1/32         trust

但它不适合我。

3 个答案:

答案 0 :(得分:3)

我遇到了同样的错误。 对我来说问题是我没有为psql用户设置密码。 在这里看到类似的问题和答案: https://askubuntu.com/questions/413585/postgres-password-authentication-fails

当我做的时候它解决了

ALTER USER db_username PASSWORD 'new_password'

答案 1 :(得分:1)

这是一个古老的问题,我想这对您来说并不重要,但对于将来有同样问题的人来说:

我也被困住了。我发现postgres的默认行为会将所有内容都转换为小写。[1] 当我将用户转换为小写字母时,我的问题解决了。

对不起,英语不好:(

答案 2 :(得分:1)

在对我的sqlalchemy代码进行调试之后,我看到sqlalchemy使用的url是解码的url-string(至少对于postgres而言)。这意味着,如果您的连接字符串中有子字符串,例如%34,则sqlalchemy连接字符串将为4,因为这是URL解码的字符串。解决此问题的方法很简单:只需将连接字符串中所有发生的%替换为%25,因为这是%的url编码。的代码很简单:

from sqlalchemy import create_engine
connection_string_orig = "postgres://user_with_%34_in_the_string:pw@host:port/db"
connection_string = connection_string_orig.replace("%", "%25")
engine = create_engine(connection_string)
print(engine.url) # should be identical to connection_string_orig
engine.connect()

这可能无法解决每个人的问题,但是意识到这一点仍然是一件好事。