[Python] relation does not exist in flask sqlalchemy, although create function called

Discussão em 'Python' iniciado por Stack, Agosto 24, 2025.

  1. Stack

    Stack Membro Participativo

    I'm attempting to modularize my flask app by splitting models, the db, routers, etc into separate files. This has been giving me some trouble, because it seems that my tables are not being created as I expect.

    I have this file called flask_postgres_server.py

    from . import flask_server
    from flask_sqlalchemy import SQLAlchemy
    from flask import jsonify, request

    from . import models
    Tree = models.tree.Tree_postgres.Tree
    app = flask_server.app # this simply exports an instance of a flask app, so I can use it in another server with mongo


    @app.route("/trees", methods=['POST'])
    def create_tree_postgres():
    label = request.get_json['label']
    tree = Tree(label=label)
    tree.save()
    return jsonify(tree.get_dict())


    I am importing a Tree model:

    from ... import postgres_db
    db = postgres_db.db

    class Tree(db.Model):
    __tablename__ = 'trees'
    id = db.Column(db.Integer, primary_key=True)
    label = db.Column(db.String(), nullable=False)

    def save(self):
    db.session.add(self)
    db.session.commit()
    db.session.expunge_all()
    db.session.close()

    def get_dict(self):
    return {"label": self.label, "_id": self.id}


    which in turn imports the db:

    from . import flask_server
    app = flask_server.app
    import os
    from dotenv import load_dotenv, find_dotenv
    from flask_sqlalchemy import SQLAlchemy


    """
    Imported by a server in order to set up a postgres connection for use by a Flask server
    """

    load_dotenv(find_dotenv())

    DB_NAME = os.environ.get("DB_NAME")
    POSTGRES_HOST = os.environ.get("POSTGRES_HOST")
    POSTGRES_PORT = os.environ.get("POSTGRES_PORT")
    POSTGRES_USER = os.environ.get("POSTGRES_USER")
    POSTGRES_PASSWORD = os.environ.get("POSTGRES_PASSWORD")

    DB_URI = f'postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}/{DB_NAME}'
    app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI

    db = SQLAlchemy(app)
    db.create_all()


    When I run my server and get post data at /trees, I get this error message:

    sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "trees" does not exist
    LINE 1: INSERT INTO trees (label) VALUES ('countries') RETURNING tre...
    ^

    [SQL: INSERT INTO trees (label) VALUES (%(label)s) RETURNING trees.id]
    [parameters: {'label': 'countries'}]


    Shouldn't this relation have been created automatically?

    I can go into psql and create this table manually. Then I get another error saying:

    DetachedInstanceError: Instance <Tree at 0x10d2facd0> is not bound to a Session


    Is there something wrong with the way I've structured my code?

    Continue reading...

Compartilhe esta Página