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

Осваиваю миграцию db. Сделана таблица user:
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='admin@example.com')
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='admin@example.com')
        db.session.add(u)
        db.session.commit()


Ошибок нет, но в таблицу юзера не добавляет.
  • Вопрос задан
  • 22 просмотра
Решения вопроса 1
cubinez85
@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='admin@example.com')
    db.session.add(u)
    db.session.commit()

Правда переменные 'basedir' и 'SQLALCHEMY_DATABASE_URI' были оформлены в config.py
Вообщем insert и select проще делать другими способами.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы