1
resposta

Não consigo me conectar ao banco

Levantei o postgresql através de um docker, e configurei o Flask para realizar conexão da seguinte forma: Quando conecto usando essas credenciais pelo DBeaver consigo conectar normalmente.

app = Flask(__name__)
app.config['SQLAlchemy_DATABASE_uri'] = "postgresql://postgres:postgres@db:5432/habit_project"

db = SQLAlchemy(app)

Criei uma entidade Messages

class Messages(db.Model):
    __tablename__ = 'messages'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    created_at = db.Column(db.DateTime, nullable=False)
    updated_at = db.Column(db.DateTime, nullable=False)
    public_id = db.Column(db.String(36), nullable=False)
    message = db.Column(db.String(100), nullable=False)
    id_user_from = db.Column(db.Integer, db.ForeignKey('clients.id'),
        nullable=True)
    id_user_to = db.Column(db.Integer, db.ForeignKey('clients.id'),
        nullable=True)

    def __repr__(self): 
        return '<Name %r>' % self.name

E por fim criei uma rota tal como abaixo.

@app.route('/inicio')
def index():
    lista = db.session.query(Messages).all()
    print(lista)
    #return {lista}
    return lista

A variável lista que deveria trazer todos os registros de Messages retorna lista vazia, sendo que a tabela possui dois registros. Alguém saberia me dizer o que estou fazendo de errado ?

1 resposta

Olá Larissa, como você está?

Peço desculpas pela demora em obter um retorno.

O seu código possui uma lógica correta, no entanto, uma possível razão para a lista estar vazia é que a sessão do banco de dados não foi confirmada após a inserção dos registros.

Para garantir que a sessão seja confirmada, você pode adicionar db.session.commit() após inserir os registros.

Além disso, verifique se os registros foram inseridos corretamente no banco de dados, executando uma consulta diretamente no banco de dados usando o DBeaver ou qualquer outra ferramenta de gerenciamento de banco de dados.

Outro detalhe, é adicionar um tratamento de exceção para verificar se há erros durante a consulta do banco de dados. Você pode fazer isso com o seguinte código.

Deixo abaixo um código funcional com as dicas dadas acima:

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://usuario:senha@localhost:5432/nome_do_banco'

db = SQLAlchemy(app)

class Messages(db.Model):
    __tablename__ = 'messages'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    created_at = db.Column(db.DateTime, nullable=False)
    updated_at = db.Column(db.DateTime, nullable=False)
    public_id = db.Column(db.String(36), nullable=False)
    message = db.Column(db.String(100), nullable=False)

    def __repr__(self): 
        return '<Message %r>' % self.message

with app.app_context():
    db.create_all()

@app.route('/inicio')
def index():
    try:
        messages = db.session.query(Messages).all()
        print(messages)
        msg_list = [{'id': m.id, 'created_at': m.created_at, 'updated_at': m.updated_at, 'public_id': m.public_id, 'message': m.message} for m in messages]
        return jsonify(msg_list)
    except Exception as e:
        print(e)
        db.session.rollback()
        return "Erro ao buscar dados"

@app.route('/add_messages')
def add_messages():
    try:
        msg1 = Messages(created_at=datetime.now(), updated_at=datetime.now(), public_id="1", message="Mensagem 1")
        msg2 = Messages(created_at=datetime.now(), updated_at=datetime.now(), public_id="2", message="Mensagem 2")

        db.session.add(msg1)
        db.session.add(msg2)
        db.session.commit()

        return "Dados inseridos com sucesso!"
    except Exception as e:
        print(e)
        db.session.rollback()
        return "Erro ao inserir dados"

if __name__ == '__main__':
    app.run(host='localhost', port=5000, debug=True)

Espero ter ajudado.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!