当模型在单独的文件中时数据库创建为空?
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 来说是正常的:
我正在阅读一本关于 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 来说是正常的: