Колба Python с многомодульным приложением OperationalError: (sqlite3.OperationalError) нет такой таблицы - PullRequest
0 голосов
/ 12 ноября 2019

Я недавно изучал python и практиковал несколько учебных пособий, и все шло хорошо, пока я не разделил свое приложение на подмодули, чтобы упростить обслуживание с использованием чертежей, после этого приложение упало и выдало следующую ошибку: OperationalError: (sqlite3.OperationalError) нет такой таблицы, вот как я делю свое приложение:

-instance
  -flask.cfg
-app
  - static  // Folder for css
  - templates // Folder for common html files
  -__init__.py // to init the app 
  -module1
    -__init__.py // to register module blueprint
    -subModule1
      -subModule1 Group1
        -templates
          -htmls files
        -__init__.py file //to register group1 blueprint
        -Group1Form
        -Group1Model
        -Group1View
      -subModule1 Group2
        -templates
          -htmls files
        -__init__.py file //to register group2 blueprint
        -Group2Form
        -Group2Model
        -Group2View
    -subModule2
        ....
-main.py

Приложение работает нормально, когда я использую flask run, но у меня возникает проблема, когда я использую db.session.add()метод за исключением того, что таблица не найдена. Я пробовал много решений этой проблемы, но не повезло. Вот несколько ссылок на ту же проблему:

OperationalError: (sqlite3.OperationalError) нет такой таблицы: user

https://flask -sqlalchemy.palletsprojects. com / en / 2.x / quickstart /

Python sqlite3.OperationalError: нет такой таблицы:

'Приложение не найдено. Либо работайте внутри функции просмотра, либо передавайте контекст приложения. '

Вот файл flask.cfg:

import os

BASEDIR = os.path.abspath(os.path.dirname(__file__))
SECRET_KEY = os.urandom(32)
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.abspath('app.db')

А вот как я инициализирую приложение восновной __init__.py файл:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app(config_filename=None):
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_pyfile(config_filename)
    initialize_extensions(app)
    register_blueprints(app)

def create_app(config_filename=None):
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_pyfile(config_filename)
    initialize_extensions(app)
    register_blueprints(app)
    return app

def initialize_extensions(app):
    db.init_app(app)
    with app.app_context():
        db.create_all()

def register_blueprints(app):
    from app.module1.config.university import university_blueprint
    app.register_blueprint(university_blueprint)

    from app.module1.config.department import department_blueprint
    app.register_blueprint(department_blueprint)

    from app.module1.authors.author import author_blueprint
    app.register_blueprint(author_blueprint)

    from app.module1.authors.publications import    publications_blueprint
    app.register_blueprint(publications_blueprint)

Ответы [ 2 ]

0 голосов
/ 13 ноября 2019

Я выяснил проблему, я должен был разместить:

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

после регистрации чертежей

0 голосов
/ 12 ноября 2019

вы можете переместить db.init_app () в функцию app.app_context ()

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