Flask教程--第一个Flask应用:定义和访问数据库

一、连接和断开数据库

这里的数据库使用python内置的sqlite数据库,名为sqlite3。

flaskr/db.py:

# -*- coding:utf-8 -*-
"""
define and access database
g: 独立于每一个请求的全局对象,可用于存储每个函数都用到的数据。
current_app:指向处理请求的Flask应用

"""
import sqlite3
import click
from flask import current_app
from flask import g
from flask.cli import with_appcontext


def get_db():
    """连接数据库
        1.连接之前判断数据库是否已经连接

    """
    if 'db' not in g:
        g.db = sqlite3.connect(
            current_app.config['DATABASE'],
            detect_types=sqlite3.PARSE_DECLTYPES
        )
        g.db.row_factory = sqlite3.Row

    return g.db


def close_db(e=None):
    """关闭数据库连接

    """
    db = g.pop('db', None)
    if db is not None:
        db.close()

二、创建表

创建两张表,一张是用户表(user),一张是文章表(post)。

 flaskr/schema.sql

DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);

sql语句写好好。需要在flaskr/db.py文件中读取该文件,并增加一个用于执行该sql的命令。

flaskr/db.py

def init_db():
    db = get_db()

    with current_app.open_resource('schema.sql') as f:
        db.executescript(f.read().decode('utf8'))


@click.command('init-db')
@with_appcontext
def init_db_command():
    init_db()
    click.echo('Initialized the database.')

 三、在应用实例中注册

close_db()和init_db_command()需要在实例中使用。这里使用一个函数进行注册。

flaskr/db.py

def init_app(app):
    app.teardown_appcontext(close_db)  # 返回响应后在清理的时候调用该函数
    app.cli.add_command(init_db_command)  # 添加一个新的可以与Flask一起工作的命令

flaskr/__init__.py

 在返回实例之前,调用上面的函数。

 db.init_app(app)

四、初始化数据库文件

pycharm下操作(windows系统):

set FLASK_APP=flaskr

set FLASK_ENV=development

flask init-db

 Flask教程--第一个Flask应用:定义和访问数据库_第1张图片

五、使用SQLAlchemy操作数据库

如果开发人员直接使用SQL命令,那么

 

参考资料

[1]python sqlite3, https://docs.python.org/3.7/library/sqlite3.html

[2]Flask Define and Access the database:https://flask.palletsprojects.com/en/1.1.x/tutorial/database/

你可能感兴趣的:(Flask)