当模型在单独的文件中时数据库创建为空?

Database created empty when models are in a separate file?

我正在阅读一本关于 Flask 开发的书,我对 python 总体来说还很陌生。

文件布局:

Project
|
|-- App
|   |-- __init__.py
|   |-- models.py
|
| main.py

里面的代码__init__.py:

from flask import Flask
from flask.ext.bootstrap import Bootstrap
from flask.ext.sqlalchemy import SQLAlchemy
import os
from config import options

basedir = os.path.abspath(os.path.dirname(__file__))
bootstrap = Bootstrap()
db = SQLAlchemy()

def create_app():   
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] =\
        'sqlite:///' + os.path.join(basedir, 'database_test.sqlite')

    bootstrap.init_app(app)
    db.init_app(app)

    with app.app_context():
            db.create_all()
            print("DB created")

    return(app)

我一直在研究网站上其他人的问题,主要是 here 我发现使用 with app.app_context() 的地方,并且在不使用 app 的情况下实例化数据库构造函数。

这是我的 models.py 文件:

from . import db


class User(db.Model):
    __tablename__ = 'Users'
    account_id = db.Column(db.Integer, primary_key=True)
    personaname = db.Column(db.String(50), unique=False)
    steamid = db.Column(db.String(64))
    avatar = db.Column(db.String(200))
    profileurl = db.Column(db.String(128))
    is_personaname_real = db.Column(db.Integer)

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

然后我运行 main.py 中的代码,它只是:

from app import create_app

app = create_app()

如果我将 User class 移动到 __init__.py 函数中,一切都会正常创建。但是,当 User class 在它自己的文件中时,数据库将被创建为空。我试过使用其他导入方式,可能是 From app.__init__.py Import db 之类的,但也没有用。

这应该可以,看来您缺少 if 语句

from app import create_app

app = create_app()

if __name__ == "__main__":
    app.run()

由于直接在 __init__.py 中定义模型有效,因此您需要将模型导入 __init__.py

您可以在 __init__.py 创建 SQLAlchemy 对象后添加导入:

db = SQLAlchemy()
from .models import User

这行得通,但我觉得非常错误和肮脏。我不太了解 Flask,但这个答案表明这对 Flask 来说是正常的: