Flask + Peewee:在哪里创建表?

时间:2017-03-17 11:18:51

标签: python flask peewee

而不是 flask-peewee 我使用普通的 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 个答案:

答案 0 :(得分:0)

<强>更新

我不知道 Flask 中内置的 CLI 支持。我不知道你是否应该考虑采用这种方法,因为你可以开箱即用(参见documntation)。

我可以使用 flask-script 包。我以前做过,只是忽略了它。

激活虚拟环境运行

  

pip 安装flask-script

然后在根目录中创建 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()