1.在项目包下新建一个schema文件
F:\flask-tutorial\flaskr\schema.sql
文件内容就是一段SQL语句,用途是:创建用户user表和帖子post表,创建之前会判断表是否已经存在,如果已经存在则删除后再创建。
user表有一个自增长的主键id,以及用户名username、密码password两个属性
post表也有一个自增长的主键id,以及作者id(外键-关联user表主键id),创建时间,标题,正文
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)
);
2.在项目包下创建一个python文件用于数据库操作
F:\flask-tutorial\flaskr\db.py
数据库操作内容包括:
1)获取数据库联接
2)关闭数据库联接
3)初始化数据库(生成数据库实例,执行schema.sql创建user表和post表)
import sqlite3
import click
from flask import current_app, g
from flask.cli import with_appcontext
# 获取数据库连接
def get_db():
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()
# 初始化数据库
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():
"""Clear the existing data and create new tables."""
init_db()
click.echo('Initialized the database.')
# 注册后方可使用关闭数据库和执行初始化数据库命令(需要在应用工厂中导入并调用该函数)
def init_app(app):
app.teardown_appcontext(close_db)
app.cli.add_command(init_db_command)
3.在应用工厂中导入并调用数据库初始化函数
F:\flask-tutorial\flaskr_init_.py,新增两行代码
def create_app():
app = ...
# 新添加的两行代码在下面
from . import db
db.init_app(app)
return app
4.dos窗口执行命令初始化数据库
在项目文件夹F:\flask-tutorial目录下运行
set FLASK_APP=flaskr
set FLASK_ENV=development
flask init-db
执行成功,dos窗口显示信息:
Initialized the database.
同时在项目文件夹下多了一个数据库实例instance\flaskr.sqlite
F:\flask-tutorial\instance\flaskr.sqlite
补充说明:关于SQLLite3
项目使用的是Python内置的SQLite3数据库,所以不需要安装任何东西,直接使用。
SQLite是一种嵌入式的遵守ACID的关系型数据库管理系统,它的数据库就是一个文件。
SQLIte数据库最大支持128TiB,查询条件如果是索引字段,不管什么位置,查询都不要1ms时间。
SQLite不适合多线程高并发写入,多线程高并发读取倒是非常不错。
网友评论