为什么我们需要数据库?
想象一下,你正在开发一个"待办事项"应用程序(TodoApp)。用户需要记录各种任务:买菜、学习、喂狗……这些数据需要被安全存储、快速检索。
这就是数据库的用武之地:它像一个智能文件柜,不仅能安全存放数据,还能让你快速找到需要的信息。
数据库管理系统(DBMS)就是用于管理这个文件柜的软件。
SQLite、MySQL、PostgreSQL 都是目前流行的数据库选择,而 SQL 则是人与这些数据库沟通的标准语言。
搭建 TodoApp 数据库
原生的 SQL 语句看起来冰冷而晦涩,连接、关闭、异常处理…每一步都充满陷阱。如何让你熟悉的 Python 对象与数据库里陌生的表联系起来呢?
这就是我们需要 ORM(对象关系映射) 的原因。
SQLAlchemy 是 Python 中最强大的 ORM 工具,它能将 Python 类自动转换为数据库表,让你用熟悉的 Python 语法操作数据库。
01、创建数据库连接(database.py)
我们新建一个 FastAPI 项目,名为 “FastAPIPro”。
在项目根目录,新建一个 Python 包,名为 “TodoApp”。
在 “TodoApp” 目录,新建一个 “database.py” 文件。内容如下:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 数据库文件路径,程序运行后会自动创建
SQLALCHEMY_DATABASE_URL = 'sqlite:///./todos.db'
# 创建引擎,并关闭线程检查
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
# 创建会话(用来操作数据库的“工具”)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 基础类(所有表模型都要继承它)
Base = declarative_base()
不用纠结每个参数原理,直接复制先用起来,
02、定义数据模型(models.py)
在这个文件里,将定义 “待办事项” 表要存哪些数据。
在 “TodoApp” 目录,新建 models.py 文件。内容如下:
from database import Base
from sqlalchemy import Column, Integer, String, Boolean
class Todos(Base):
__tablename__ = "todos" # 数据库表名,叫todos
# 主键id:自动递增,唯一标识每条数据(不需要手动输入)
id = Column(Integer, primary_key=True, index=True)
title = Column(String) # 待办标题
description = Column(String) # 待办描述
priority = Column(Integer) # 优先级
complete = Column(Boolean, default=False) # 是否完成(默认未完成,0=否,1=是)
03、创建数据库和表(main.py)
执行文件代码,将自动生成 todos.db文件和todos表。
新建main.py文件,代码如下:
from fastapi import FastAPI
import models
from database import engine
app = FastAPI()
# 关键!所有继承Base的模型,都会在数据库中自动创建对应的表
models.Base.metadata.create_all(bind=engine)
04、运行应用程序
在终端,进入 TodoApp 目录,并输入下面命令:
uvicorn main:app --reload
在终端看到 “Application startup complete.” 就是成功了!此时在 TodoApp 目录下会出现 todos.db文件,数据库和表就已经自动创建出来了。
SQL 实战:从入门到熟练
进行 SQLite3 命令行前,让我们先去安装它。
01、环境准备:安装 SQLite3 (Mac OS)
首先,需要先安装 Homebrew。我们访问 brew.sh ,复制页面中的这个命令。
把这条命令粘贴到终端,并执行它。我把这个命令也粘到出来了。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
执行完成后,关闭终端,并重新打开它。
执行 brew list ,查看我们是否已经有安装 sqlite。如果没有,使用下面命令安装它:
brew install sqlite
它将安装所有 sqlite 依赖项。
安装完成后,我们可以在终端执行 sqlite3 命令,进入 sqlite 命令行。
最后,可以使用 .quit 退出 sqlite 命令行
(.venv) wangerge_notes: TodoApp$ sqlite3
SQLite version 3.37.0 2021-12-09 01:34:53
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .quit
现在,我们可以在 sqlite 命令行,用 SQL 与数据库进行 “沟通”。
02、增:插入待办数据
不用写 id(自动递增)
-- 插入1条待办
INSERT INTO todos (title, description, priority, complete)
VALUES ('去超市', '买3斤鸡蛋', 4, False);
-- 再插入3条,丰富数据
INSERT INTO todos (title, description, priority, complete) VALUES ('剪草坪', '草长到10cm了', 3, False);
INSERT INTO todos (title, description, priority, complete) VALUES ('喂狗', '用新品牌狗粮', 5, False);
INSERT INTO todos (title, description, priority, complete) VALUES ('学编程', '每天1小时Python', 5, False);
-- 查看 todos 表内的数据
SELECT * FROM todos;
03、查:查询待办数据
-- 查询所有数据
SELECT * FROM todos;
-- 只查询标题
SELECT title FROM todos;
-- 按优先级查询数据
SELECT * FROM todos WHERE priority = 5;
04、改:更新待办状态
-- 将ID为5的任务标记为完成
UPDATE todos SET complete = True WHERE id = 5;
05、删:删除待办数据
-- 删除ID为4的任务
DELETE FROM todos WHERE id = 4;
06、终端操作小技巧
安装 SQLite3 后,你可以在终端直接操作数据库:
sqlite3 todos.db # 连接数据库
.schema # 查看表结构
.mode table # 设置显示模式
.quit # 退出数据库
SELECT * FROM todos; # 查询数据
结尾:你的数据库实战,才刚刚开始!
恭喜你!按照上面的步骤,你已经成功搭建了可对接 API 的 TodoApp 数据库。
尝试一下:按照本文的步骤,创建你的第一个Todo数据库。如果你在操作过程中遇到问题,欢迎在评论区留言告诉我!
关注我的公众号,下期继续深入,打通 API 与数据库的最后一公里。把 TodoApp 做成一个完整可上线的项目~
-------- 写在最后 --------
关注我,每天1分钟,轻松懂 Python
我的同名公众号正在连载《FastAPI 开发实战》、《Python 核心技术》、《职场》。
点赞 :支持技术分享!
分享 :分享给身边的朋友!
关注我 :获取更多FastAPI实战技巧!
#Python #FastAPI #API #Web开发 #程序员 #编程教程 #效率提升 #后端开发 #API设计 #参数验证