Почему возникает ошибка "работа вне контекста приложения''?
Осваиваю миграцию 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 проще делать другими способами.