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 安装烧瓶脚本

然后在你的根目录中创建 ma​​nage.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”

flask-classy 和 peewee,元类冲突错误

peewee playhouse.flask_utils import object_list 在首页啥都没有出现

如何将 Flask SQLAlchemy amp;Peewee 的查询结果转换成 json