Python Flask框架-开发简单博客-定义和操作数据库_flask创建数据库

  1. Python Flask框架-开发简单博客-开篇介绍
  2. Python Flask框架-开发简单博客-项目布局、应用设置
文章目录

1. 本章知识点总结

请添加图片描述

2. 定义(创建)数据库

2.1 简单规划

开发的个人博客,计划使用SQLite 数据库来储存用户和博客内容。 Python 内置了 SQLite 数据库支持,相应的模块为 sqlite3
如果你不是很熟悉 SQL ,请先阅读SQLite 官方文档 ,不用精通,能使用即可。

计划建两个表分别为user表和post表,sql表文件保存路径为flaskr/schema.sql

2.2 user表字段分析

  • id:用户id、整数、主键、自增加
  • username:用户名、文本、值唯一,不能重复
  • password: 登陆密码、文本、不能为空

flaskr/schema.sql

2.3 post表字段分析

  • id: 文章id、整数、主键、自增加
  • author_id:文章作者id、整数、不为空、外键
  • created:文章创建时间、时间戳、不为空(默认值为创建时间)
  • title:文章标题、文本、不为空
  • body:文章内容、文本,不为空

2.4 创建数据库的sql脚本

编写schema.sql的脚本,该脚本用于创建SQLite 数据库,并内置user表和post表。所以这个创建过程仅在个人博客第一次运行时运行一次即可。
后续数据库内容的更新应执行常规的增删改查操作。

注意,该脚本仅在个人博客第一次运行时创建数据库,后续不应再次运行(否则,数据库将被重置)。
所以在第一次运行时,要先卸载数据库中所有表,以防报错。

路径flaskr/schema.sql

// 卸载库中所有表
DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;

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

// 新建post表
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)
);

3. 操作数据库

前面写完了sql脚本,接下来就要写db.py这个python脚本,用来操作数据库。路径规划为flaskr/db.py
操作具体包括了如下几个具体功能

  • 建立数据库连接 — 用于将程序与数据库建立连接
  • 关闭数据库连接 — 完成一次操作后,及时关闭当前连接
  • 初始化数据库 — 第一次运行博客时创建数据库生成表
  • 在应用中注册db.py实现flask的调用
    这个理解起来,有点绕,简单说来,
    我们自己定义的函数需要在应用实例中注册,否则无法使用。应用实例就是app = Flask(__name__, instance_relative_config=True)但是问题是,这个app=我们是写在了工厂函数中(create_app)。意思就是这个实例其实并没有建立,所以我们这个注册只能在工厂函数中注册。那问题来了,在一个工厂函数中如何注册。
    答案就是,函数调用另一个函数实现:工厂函数中app实例动态创建时,动态调用注册函数,实现动态注册。

flaskr/db.py 请注意代码中的注释和下面关于各函数的说明文字。

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


# 1.创建数据库连接
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


# 2. 关闭数据库连接
def close\_db():
    db = g.pop('db', None)
    if db is not None:
        db.close()


# 3. 初始化数据库
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
# app context,应用上下文,存储的是应用级别的信息,比如数据库连接信息。
# request context,程序上下文,存储的是请求级别的信息,比如当前访问的url
def init\_db\_command():
    init_db()
    click.echo('数据库初始化成功。')


# 4. 在应用中注册`db.py`实现flask的调用
# 此处为注册函数,另一端在工厂函数(create\_app)中,动态调用此函数,实现动态注册。
def init\_app(app):
    # teardown\_appcontext
    # 不管是否有异常,注册的函数都会在每次请求之后执行。
    # flask 为上下文提供了一个 teardown\_appcontext 钩子,使用它注册的毁掉函数会在程序上下文被销毁时调用,通常也在请求上下文被销毁时调用。
    # 比如你需要在每个请求处理结束后销毁数据库连接:app.teardown\_appcontext 装饰器注册的回调函数需要接收异常对象作为参数,当请求被正常处理时这个参数将是None,这个函数的返回值将被忽略。
    # 参考链接 https://www.cnblogs.com/Wu13241454771/p/15439350.html
    app.teardown_appcontext(close_db)
    app.cli.add_command(init_db_command)

  1. g 是一个特殊对象,独立于每一个请求。在处理请求过程中,它可以用于储存可能多个函数都会用到的数据。把连接储存于其中,可以多次使用,而不用在同一个请求中每次调用 get_db 时都创建一个新的连接。
  2. current_app 是另一个特殊对象,该对象指向处理请求的 Flask 应用。这里使用了应用工厂,那么在其余的代码中就不会出现应用对象。当应用创建后,在处理一个请求时, get_db 会被调用。这样就需要使用 current_app 。
  3. sqlite3.connect() 建立一个数据库连接,该连接指向配置中的 DATABASE 指定的文件。这个文件现在还没有建立,后面会在初始化数据库的时候建立该文件。
  4. sqlite3.Row 告诉连接返回类似于字典的行,这样可以通过列名称来操作数据。
  5. close_db 通过检查 g.db 来确定连接是否已经建立。如果连接已建立,那么就关闭连接。以后会在应用工厂中告诉应用 close_db 函数,这样每次请求后就会调用它。
  6. open_resource() 打开一个文件,该文件名是相对于 flaskr 包的。这样就不需要考虑以后应用具体部署在哪个位置。 get_db 返回一个数据库连接,用于执行文件中的命令。

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)Python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO系列是基于深度学习的端到端实时目标检测方法。 PyTorch版的YOLOv5轻量而高性能,更加灵活和易用,当前非常流行。 本课程将手把手地教大家使用labelImg标注和使用YOLOv5训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。  本课程的YOLOv5使用ultralytics/yolov5,在Windows和Ubuntu系统上分别做项目演示。包括:安装YOLOv5、标注自己的数据集、准备自己的数据集(自动划分训练集和验证集)、修改配置文件、使用wandb训练可视化工具、训练自己的数据集、测试训练出的网络模型和性能统计。 除本课程《YOLOv5实战训练自己的数据集(Windows和Ubuntu演示)》外,本人推出了有关YOLOv5目标检测的系列课程。请持续关注该系列的其它视频课程,包括:《YOLOv5(PyTorch)目标检测:原理与源码解析》课程链接:https://edu.csdn.net/course/detail/31428《YOLOv5目标检测实战:Flask Web部署》课程链接:https://edu.csdn.net/course/detail/31087《YOLOv5(PyTorch)目标检测实战:TensorRT加速部署》课程链接:https://edu.csdn.net/course/detail/32303《YOLOv5目标检测实战:Jetson Nano部署》课程链接:https://edu.csdn.net/course/detail/32451《YOLOv5+DeepSORT多目标跟踪与计数精讲》课程链接:https://edu.csdn.net/course/detail/32669《YOLOv5实战口罩佩戴检测》课程链接:https://edu.csdn.net/course/detail/32744《YOLOv5实战中国交通标志识别》课程链接:https://edu.csdn.net/course/detail/35209 《YOLOv5实战垃圾分类目标检测》课程链接:https://edu.csdn.net/course/detail/35284  
首先,你需要使用 PythonFlask 框架来实现 Web 应用程序,然后连接到你的数据库。 在 Flask 中,你可以使用 Flask-SQLAlchemy 扩展来连接到常见的 SQL 数据库,如 MySQL、PostgreSQL 和 SQLite。这个扩展提供了一个 SQLALCHEMY_DATABASE_URI 配置选项,你需要设置为指向你的数据库的连接字符串。 下面是一个简单的示例,它连接到 SQLite 数据库,并在 Web 页面上显示其中的数据: ```python from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' db = SQLAlchemy(app) class Person(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), nullable=False) def __repr__(self): return f'<Person {self.id}>' @app.route('/') def index(): people = Person.query.all() return render_template('index.html', people=people) ``` 在这个示例中,我们定义了一个名为 Person 的模型,它映射到数据库中的一个表。然后,我们使用 Flask-SQLAlchemy 扩展来连接到 SQLite 数据库,并将其设置为应用程序的默认数据库。 在 index() 视图函数中,我们查询所有的 Person 记录,并将它们传递给一个名为 index.html 的模板,该模板将显示这些记录。 下面是 index.html 模板的代码: ```html <!DOCTYPE html> <html> <head> <title>People</title> </head> <body> <table> <thead> <tr> <th>ID</th> <th>Name</th> </tr> </thead> <tbody> {% for person in people %} <tr> <td>{{ person.id }}</td> <td>{{ person.name }}</td> </tr> {% endfor %} </tbody> </table> </body> </html> ``` 在这个模板中,我们使用一个名为 people 的变量来迭代所有的 Person 记录,并将它们显示在一个 HTML 表格中。 最后,你需要运行这个应用程序,并导航到 http://localhost:5000/,就可以在 Web 页面上看到数据库中的数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值