Базовая проблема контекста SQLAlchemy - PullRequest
0 голосов
/ 30 января 2019

Я читал многие другие посты о том, что модели отделены от основного приложения, но я не могу заставить его работать только с app.py (мое реальное приложение) и models.py (мои модели базы данных).

Если я делаю следующее, я получаю файл app.db без таблиц:

from app import db
db.create_all() 

Если я делаю следующее, я получаю RuntimeError: Приложение не найдено.Либо работайте внутри функции представления, либо выдвигайте контекст приложения.:, похоже, ничего из этого не работает в моем случае.

Вот мой app.py:

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
from models import userTable

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

@app.route('/', methods=['GET', 'POST'])
def home():
    return "home"

if __name__ == '__main__':
    app.run(debug=True)

Вот мой models.py:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class userTable(db.Model):

    __tablename__ = "userTable"

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)

1 Ответ

0 голосов
/ 31 января 2019

Возможно, вы можете попробовать следующее:

app.py

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
import models
from models import initialize_db

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

initialize_db(app)

@app.route('/', methods=['GET', 'POST'])
def home():
    return "home"

if __name__ == '__main__':
    app.run(debug=True)

models.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

def initialize_db(app):
  app.app_context().push()
  db.init_app(app)
  db.create_all()

class userTable(db.Model):

    __tablename__ = "userTable"

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)

Ключ создает функцию инициализации базы данных внутри models.py, которая принимает экземпляр приложения в качестве параметра.Эта функция создает таблицы базы данных только тогда, когда у нее есть экземпляр приложения.Это позволит вам изначально импортировать модуль моделей без экземпляра приложения и при этом иметь модульную конструкцию.

...