Почему возникает ошибка "работа вне контекста приложения''?

Осваиваю миграцию db. Сделана таблица user:

from datetime import datetime
from app import db


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return '<User {}>'.format(self.username)

Хочу внести пользователя:

import app
from app import db
from app.models import User

u = User(username='admin', email='[email protected]')
db.session.add(u)
db.session.commit()

В результате ошибка:

RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information.

Если обернуть в оболочку with app.app_context(), ошибка:

AttributeError: module 'app' has no attribute 'app_context'

В Pycharm прогнал код:

from flask import Flask
from app import db
from app.models import User

def create_app():
    app = Flask(__name__)
    with app.app_context():
        u = User(username='admin', email='[email protected]')
        db.session.add(u)
        db.session.commit()```

Ошибок нет, но в таблицу юзера не добавляет.


Ответы (1 шт):

Автор решения: cubinez85

Вообщем такое вот решение, правда кривое:

from flask import Flask
from app import db
from app.models import User
from flask_sqlalchemy import SQLAlchemy
import os

app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL') or \
                              'sqlite:///' + os.path.join(basedir, 'app.db')

db = SQLAlchemy(app)

with app.app_context():

    u = User(username='admin', email='[email protected]')
    db.session.add(u)
    db.session.commit()```
Правда переменные 'basedir' и 'SQLALCHEMY_DATABASE_URI' были оформлены в config.py
Вообщем insert и select проще делать другими способами.
→ Ссылка