flask_sqlalchemy. Если запрашивать данные таблицы из стороннего класса - не находит таблицу. Если не из класса - находит

Статус
Закрыто для дальнейших ответов.

ComicSphinx

Новичок
Пользователь
Янв 3, 2022
7
0
1
Добрый день!
Есть таблица:
Код:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///main.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

class Presentation(db.Model):
    __tablename__ = "Presentation"
    id                  = db.Column(db.Integer, primary_key=True)
    title               = db.Column(db.String, nullable = False)
    description         = db.Column(db.String)
    descriptionTitle    = db.Column(db.String, nullable = False)
    firstImagePath      = db.Column(db.String, nullable = False)
    secondImagePath     = db.Column(db.String, nullable = False)
    thirdImagePath      = db.Column(db.String, nullable = False)
    fourthImagePath     = db.Column(db.String, nullable = False)
    fifthImagePath      = db.Column(db.String, nullable = False)
    sixthImagePath      = db.Column(db.String, nullable = False)
    seventhImagePath    = db.Column(db.String, nullable = False)
    eightImagePath      = db.Column(db.String, nullable = False)
    mainImagePath       = db.Column(db.String, nullable = False)
    active              = db.Column(db.Boolean, nullable = False)

Есть сервис на фласке, в котором пытаюсь получать данные из этой таблицы (не рабочий вариант):
Код:
from flask import Flask
from flask_restful import Api, Resource
from flask_sqlalchemy import SQLAlchemy
from Models import db, Presentation

app = Flask(__name__)
api = Api(app)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

class DatabaseService(Resource):

    @app.route('/getPresentationById/<id>', methods=['GET'])
    def getPresentationById(id):
        presentation = Presentation()
        presentation.query.all()

api.add_resource(DatabaseService)
if __name__ == "__main__":
    db = SQLAlchemy()
    db.init_app(app)
    app.run(host='127.0.0.1', port=80, debug=True)

Получаю ошибку:
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: Presentation

НО! Работает такой вариант:
Код:
from Models import Presentation

if __name__ == "__main__":
    presentation = Presentation()
    print(presentation.query.all()) #[<Presentation 1>]

Следовательно, оно не работает именно из класса. Я пробовал создавать метод вне класса, инициализировать в нем Presentation и отдавать на выход. Если вызывать данный метод из класса - результат аналогичен, ошибка. Если вызывать из стартовой точки __name__=="__main__" - оно работает.

В чем может быть причина? Сама таблица существует, прикладываю скриншот
1641414988123.png

Окружение:
1. Windows 11
2. Python 3.10.1
Package Version
---------------- -------
aniso8601 9.0.1
click 8.0.3
colorama 0.4.4
Flask 2.0.2
Flask-Login 0.5.0
Flask-RESTful 0.3.9
Flask-SQLAlchemy 2.5.1
greenlet 1.1.2
itsdangerous 2.0.1
Jinja2 3.0.3
MarkupSafe 2.0.1
pip 21.2.4
psycopg2 2.9.3
pytz 2021.3
setuptools 58.1.0
six 1.16.0
SQLAlchemy 1.4.29
Werkzeug 2.0.2
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В чем может быть причина? Сама таблица существует, прикладываю скриншот
В коде сервиса, который вы привели выше. У вас приложение (app) и база (db) уже созданы в файле Models.py и в файле сервиса вы пытаетесь их создать заново вместо того чтобы импортировать.
Попробуйте изменить код так:
Python:
# файл Models.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///main.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)


class Presentation(db.Model):
    __tablename__ = "Presentation"
    id                  = db.Column(db.Integer, primary_key=True)
    title               = db.Column(db.String, nullable = False)
    description         = db.Column(db.String)
    descriptionTitle    = db.Column(db.String, nullable = False)
    firstImagePath      = db.Column(db.String, nullable = False)
    secondImagePath     = db.Column(db.String, nullable = False)
    thirdImagePath      = db.Column(db.String, nullable = False)
    fourthImagePath     = db.Column(db.String, nullable = False)
    fifthImagePath      = db.Column(db.String, nullable = False)
    sixthImagePath      = db.Column(db.String, nullable = False)
    seventhImagePath    = db.Column(db.String, nullable = False)
    eightImagePath      = db.Column(db.String, nullable = False)
    mainImagePath       = db.Column(db.String, nullable = False)
    active              = db.Column(db.Boolean, nullable = False)

    def serialize(self):
        return {
            'id': self.id,
            'title': self.title,
            'description': self.description,
            'descriptionTitle': self.descriptionTitle,
            'firstImagePath': self.firstImagePath,
            'secondImagePath': self.secondImagePath,
            'thirdImagePath': self.thirdImagePath,
            'fourthImagePath': self.fourthImagePath,
            'fifthImagePath': self.fifthImagePath,
            'sixthImagePath': self.sixthImagePath,
            'seventhImagePath': self.seventhImagePath,
            'eightImagePath': self.eightImagePath,
            'mainImagePath': self.mainImagePath,
            'active': self.active
        }
Python:
# файл с сервисом
from flask_restful import Api, Resource
from Models import Presentation, app


api = Api(app)


class DatabaseService(Resource):

    @app.route('/getPresentationById/<id>', methods=['GET'])
    def getPresentationById(id):
        presentation = Presentation.query.filter_by(id=id).first_or_404()

        return Presentation.serialize(presentation)


api.add_resource(DatabaseService)


if __name__ == "__main__":
    app.run(host='127.0.0.1', port=80, debug=True)
 

ComicSphinx

Новичок
Пользователь
Янв 3, 2022
7
0
1
Может ли это быть баг конкретной версии либы?
 

ComicSphinx

Новичок
Пользователь
Янв 3, 2022
7
0
1
Помогло, спасибо огромное!
Можно закрывать
 
Статус
Закрыто для дальнейших ответов.

Форум IT Специалистов