Flask + Peewee:在哪里创建表格?
Posted
技术标签:
【中文标题】Flask + Peewee:在哪里创建表格?【英文标题】:Flask + Peewee: where to create tables? 【发布时间】:2017-03-17 11:18:51 【问题描述】:我使用的是普通的 peewee 包,而不是 flask-peewee。
这是我初始化数据库的方式:
import os
# just extending the BaseFlask with yaml config reader
from . extensions.flask_app import Flask
# peewee's wrapper around the database
from playhouse.flask_utils import FlaskDB
db_wrapper = FlaskDB()
# define the application factory
def create_app(env):
app = Flask(__name__)
# load config depending on the environment
app.config.from_yaml(os.path.join(app.root_path, 'config.yml'), env)
# init extensions
db_wrapper.init_app(app)
# ...
我知道我应该调用它来创建表:
from . models import User
db_wrapper.database.connect()
db_wrapper.database.create_tables([User])
但是我应该把建表代码放在哪里,这样数据库就已经初始化了?
编辑
查看docs我发现我可以这样使用User.create_table(fail_silently=True)
:
# in app/__init__.py
# define the application factory
def create_app(env):
app = Flask(__name__)
# load config depending on the environment
app.config.from_yaml(os.path.join(app.root_path, 'config.yml'), env)
# init extensions
db_wrapper.init_app(app)
create_tables();
# rest of the initialization
def create_tables():
from . models import User
User.create_table(fail_silently=True)
在这里可以吗?或者有更好的方法/工具吗?
编辑
想通了。请看下面我的回答。
【问题讨论】:
【参考方案1】:更新
我不知道 Flask 中内置的 CLI 支持。我不知道您是否应该考虑这种方法,因为您可以开箱即用(请参阅documntation)。
我可以使用 flask-script 包。我以前做过,只是忽略了。
激活您的虚拟环境并运行:
pip 安装烧瓶脚本
然后在你的根目录中创建 manage.py 文件,添加这些行:
import os
from app import create_app, db_wrapper
from app.models import *
from flask_script import Manager, Shell
# create the application instance
app = create_app(os.getenv('FLASK_ENV', 'development'))
# instantiate script manager
manager = Manager(app)
def make_shell_context():
return dict(app=app, db_wrapper=db_wrapper, User=User)
@manager.command
def run_shell():
Shell(make_context = make_shell_context).run(no_ipython=True, no_bpython=True)
# here's my simple command
@manager.command
def create_tables():
User.create_table(fail_silently=True)
@manager.command
def run_tests():
import unittest
tests = unittest.TestLoader().discover('tests')
unittest.TextTestRunner(verbosity=2).run(tests)
# run it
if __name__ == '__main__':
manager.run()
【讨论】:
创建表后一定要清理你的连接! @coleifer 你的意思是我需要打电话给db.close()
,db.open()
?
db.close() -- 没有 db.open() 虽然有 db.connect() 。没有必要调用 connect(),因为它会在您第一次尝试在关闭的数据库上执行查询时调用。当然我觉得显式调用connect()很好,但严格来说不是必须的。
@coleifer 好的,知道了。谢谢。以上是关于Flask + Peewee:在哪里创建表格?的主要内容,如果未能解决你的问题,请参考以下文章
Flask和peewee FlaskDB()“连接已经打开”与APScheduler
如何更改 Flask-peewee 中的 UserDoesNotExist SELECT 行为 - python & mysql
Flask peewee AttributeError:“ModelSelect”对象没有属性“_meta”