Soy nuevo en Python. Tengo que desarrollar una aplicación Flask simple (en mi Ubuntu 16.4 local) con PostgreSQL como base de datos.
Instalo pgadmin, Flask, SQLAlchemy y postgres y también este es el código de mi aplicación:
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()También creo una base de datos y un nuevo usuario en pgAdmin (y los reemplazo con una variable relacionada en mi código), pero cuando intento probar este código en Python Shell, encontré un error.
mi código pitón:
from app import dbresultado:
/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 'Entonces:
db.create_all()resultado:
(psycopg2.OperationalError) FATAL: password authentication failed for user "dbUserName" FATAL: password authentication failed for user "dbUserName"Después de mucho buscar en el foro encontré esta guía:
en su pg_hba.conf
# IPv4 local connections: # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 127.0.0.1/32 trust
Pero no me funciona.
Estaba atascado con este mismo error. El problema para mí fue que no había configurado la contraseña para el usuario de psql. Ver pregunta similar con respuesta aquí: https://askubuntu.com/questions/413585/postgres-password-authentication-fails
se resolvió cuando lo hice
ALTER USER db_username PASSWORD 'new_password'es una vieja pregunta y supongo que no es importante para usted, pero para las personas con el mismo problema en el futuro:
yo también estaba atascado. Encontré que el comportamiento predeterminado de Postgres convierte todo a minúsculas. [1] mi problema se resolvió cuando convertí mi usuario a minúsculas.
perdon por el mal ingles :(
Después de depurar un poco mi código sqlalchemy, vi que la url que sqlalchemy usaba era una cadena de url decodificada (al menos para postgres). Esto significa que si tiene subcadenas en su cadena de conexión como %34 , la cadena de conexión de sqlalchemy será 4 , ya que esa es la cadena decodificada de URL. La solución para este problema es simple: simplemente reemplace todas las apariciones de % en la cadena de conexión con %25 , ya que esa es la codificación de URL para % . El código para esto es simplemente:
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()Probablemente esto no resuelva el problema de todos, pero es bueno estar al tanto.