一、连接和断开数据库
这里的数据库使用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
五、使用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/