前面几篇文章里,我主要在用FastAPI写接口,包括参数校验、异步请求和缓存。

接口多了之后,一个很明显的问题就冒出来了:

数据到底该放哪?

如果只是简单Demo,直接写在Python变量里也行。但只要有用户、配置、记录、登录状态这些,就必须用真正的持久化存储。

个人项目的话,我比较喜欢从SQLite开始。

SQLite不用单独跑数据库服务,一个.db文件就能搞定整个数据库,很适合小型项目、个人工具和原型开发。

SQLite是什么

SQLite是一个嵌入式关系型数据库。

和MySQL、PostgreSQL不一样,它不需要单独启动一个数据库服务器。

比如:

project/
├── main.py
├── app.db
└── requirements.txt

app.db直接就是数据库文件。

对个人项目来说这种方式很方便。

尤其是:

  • 本地工具
  • AI工具
  • 小型API服务
  • 数据量不大的后台
  • 原型项目

没必要一开始就部署一个完整的MySQL。

创建数据库

Python自带sqlite3模块,最简单的方式甚至不用额外装东西。

import sqlite3

conn = sqlite3.connect("app.db")

cursor = conn.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL,
    email TEXT,
    created_at TEXT
)
""")

conn.commit()
conn.close()

第一次跑完之后,项目目录里就会出现:

app.db

表也建好了。

插入数据

比如创建用户:

conn = sqlite3.connect("app.db")

cursor = conn.cursor()

cursor.execute(
    """
    INSERT INTO users (username, email, created_at)
    VALUES (?, ?, ?)
    """,
    ("alice", "[email protected]", "2025-05-05")
)

conn.commit()
conn.close()

注意SQL里用的是?占位符,不是直接拼字符串。

别这么写:

sql = f"INSERT INTO users VALUES ('{username}')"

字符串拼SQL很容易出注入问题。

查询数据

查询也很简单:

conn = sqlite3.connect("app.db")

cursor = conn.cursor()

cursor.execute("SELECT * FROM users")

users = cursor.fetchall()

conn.close()

拿到的就是查询结果。

放到FastAPI里

接下来把数据库和API接起来。

from fastapi import FastAPI
import sqlite3

app = FastAPI()

@app.get("/users")
def get_users():
    conn = sqlite3.connect("app.db")
    cursor = conn.cursor()

    cursor.execute(
        "SELECT id, username, email FROM users"
    )

    rows = cursor.fetchall()

    conn.close()

    return [
        {
            "id": row[0],
            "username": row[1],
            "email": row[2],
        }
        for row in rows
    ]

访问:

GET /users

就能直接返回数据库里的用户了。

数据库不只是"存数据"

实际开发里,数据库最大的价值不是简单存东西。

它还负责:

  • 数据结构
  • 唯一性
  • 数据关系
  • 查询
  • 排序
  • 条件过滤
  • 持久化
  • 数据一致性

比如用户名一般要唯一:

username TEXT NOT NULL UNIQUE

这样就算程序有bug,也不会轻易出现两个相同的用户名。

SQLite适合什么项目

SQLite不是"低端数据库"。

它真正的优势是简单。

如果项目规模不大,我一般优先考虑:

FastAPI
    ↓
SQLite
    ↓
一个.db文件

而不是一上来就:

FastAPI
    ↓
MySQL
    ↓
数据库服务器
    ↓
连接池
    ↓
Docker

技术选型最重要的不是"哪个数据库更强",而是哪个更适合当前项目。

对个人项目来说,能快速开发、部署简单,往往比数据库本身的极限性能更重要。

总结

FastAPI解决的是API服务的问题,SQLite解决的是数据持久化的问题。

两个搭在一起,一个简单的后端服务基本就有了:

HTTP API
+
业务逻辑
+
数据库

下一步要解决的就是怎么更好地管理数据库连接,以及怎么让数据库操作融入FastAPI的依赖系统。

这也是后端项目从Demo走向真正项目结构的重要一步。

最后修改:2026 年 09 月 02 日
如果觉得我的文章对你有用,请随意赞赏