Flask新人求问,数据库初始化在什么时候做?

数据库初始化工作,比如建表这种工作,肯定一开始就做好了。但是我没有找到flask有什么初始化的方法,我直接写在appname.py这个文件里的时候,每次请求都会运行,这不就浪费了吗?网站部署后,数据库表肯定是要建好了的,用户请求的时候肯定不需要再去做建表的事。

所以想问数据库初始化的方法写在哪?

初学flask,代码部署在新浪云SAE,现在只是刚开始学,学到使用数据库,数据库用的MySQLdb,因为SAE内置支持的这个。

上下代码:

import MySQLdb
from flask import Flask, g, request

app = Flask(__name__)
app.debug = True

from sae.const import (MYSQL_HOST, MYSQL_HOST_S,
    MYSQL_PORT, MYSQL_USER, MYSQL_PASS, MYSQL_DB
)

status = __name__
initdbStatus = 'initdbStatus'

def init_db():
    db = MySQLdb.connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS,
                           MYSQL_DB, port=int(MYSQL_PORT))
    cursor = db.cursor()
    cursor.execute("create table if not exists  demo (id INT NOT NULL AUTO_INCREMENT,title text not null,text text not null, PRIMARY KEY (id))")
    cursor.execute('select * from demo')

    cursor.close()
    global initdbStatus
    initdbStatus = 'initdbStatus:finished'
    

@app.before_request
def before_request():
    global status
   
    print status
    g.db = MySQLdb.connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS,
                           MYSQL_DB, port=int(MYSQL_PORT))
    
    print status

@app.teardown_request
def teardown_request(exception):
    if hasattr(g, 'db'): g.db.close()

init_db()

我写了个init_db()的函数,在里面做建表的事,但是每次请求,这个函数都会调用,觉得浪费了,所以这个工作该放在哪里,或者用什么配置来做?

阅读 6.5k
2 个回答

把它分成另一个模块,然后以单例模式注入到你的主模块中。

请求钩子before_first_request中执行应该可以。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题