当模型位于单独的文件中时,数据库是空的?

时间:2015-05-08 12:46:11

标签: python flask flask-sqlalchemy

我正在读一本关于烧瓶开发的书,我对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类移到__init__.py函数中,那么一切都很好。但是,当User类位于其自己的文件中时,数据库将创建为空。我尝试过使用其他导入方式,可能是类似From app.__init__.py Import db的方法,但是也没有。

2 个答案:

答案 0 :(得分:2)

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

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

db = SQLAlchemy()
from .models import User

这样可行,但对我来说感觉非常错误和肮脏。我不太了解Flask,但这个答案表明这对Flask来说是正常的:https://stackoverflow.com/a/19008403/21945

答案 1 :(得分:0)

这应该有效,似乎你错过了if语句

from app import create_app

app = create_app()

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