记账网站3-连数据库

第 1 步:打开 MySQL,然后创建一个数据库

复制代码
CREATE DATABASE moneyweb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

然后:

复制代码
USE moneyweb;

接着创建第一张表:

复制代码
CREATE TABLE transactions (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    type ENUM('income', 'expense') NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    category VARCHAR(50) NOT NULL,
    note VARCHAR(255),
    transaction_date DATE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

你现在先只做这一步。

做完以后执行:

复制代码
SHOW TABLES;

如果看到:

复制代码
transactions

就说明成功了。

第 2 步:让 Next.js 连接 MySQL

现在的网站和数据库还是两个互相不认识的人:

复制代码
复制代码
浏览器
   ↓
Next.js 页面
   ↓
???
   ↓
MySQL moneyweb
   ↓
transactions

我们接下来就是把中间打通。

1.退出 MySQL

你现在这个窗口输入:

复制代码
exit;

回车。

然后回到你的 VS Code。

2.安装 MySQL 驱动

在 VS Code 的 moneyweb 项目终端里输入:

复制代码
npm install mysql2

注意一定确认终端当前位置是类似:

复制代码
D:\daima\moneyweb>

安装完成后,通常会看到类似:

复制代码
added ... packages

或者:

复制代码
up to date

都可以。

3.创建环境变量文件

在 VS Code 左边项目最外层,也就是和:

复制代码
package.json
next.config.ts
tsconfig.json

同一级的位置,新建:

复制代码
.env.local

里面写:

复制代码
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=你的MySQL密码
DB_NAME=moneyweb

4.创建数据库连接文件

接下来在项目里新建:

复制代码
lib

文件夹。

然后在 lib 里面新建:

复制代码
db.ts

所以结构大概变成:

复制代码
moneyweb
├─ app
├─ lib
│  └─ db.ts       ← 新建
├─ public
├─ .env.local     ← 新建
├─ package.json
├─ tsconfig.json
└─ ...

打开 db.ts,写:

复制代码
import mysql from "mysql2/promise";

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
});

export default pool;

第 3 步:查数据

1.创建 API

app 文件夹里面依次创建:

复制代码
api
└─ transactions
   └─ route.ts

最后的目录应该是:

复制代码
moneyWeb
├─ app
│  ├─ api
│  │  └─ transactions
│  │     └─ route.ts
│  ├─ globals.css
│  ├─ layout.tsx
│  └─ page.tsx
├─ lib
│  └─ db.ts
├─ .env.local
└─ ...

然后打开 route.ts,写:

复制代码
import { NextResponse } from "next/server";
import pool from "@/lib/db";

export async function GET() {
  try {
    const [rows] = await pool.query(
      "SELECT * FROM transactions ORDER BY transaction_date DESC"
    );

    return NextResponse.json(rows);
  } catch (error) {
    console.error("查询账单失败:", error);

    return NextResponse.json(
      { error: "查询账单失败" },
      { status: 500 }
    );
  }
}

这几行在干嘛:

复制代码
浏览器访问 /api/transactions
              ↓
        GET() 被执行
              ↓
         pool.query()
              ↓
          连接 MySQL
              ↓
SELECT * FROM transactions
              ↓
        返回查询结果
              ↓
      浏览器看到 JSON

2.启动项目测试

保存文件后,在下面终端输入:

复制代码
npm run dev

看到类似:

复制代码
Local: http://localhost:3000

之后在浏览器访问:

http://localhost:3000/api/transactions

这里有两个很重要的可能结果:

如果看到:

复制代码
[]

🎉 成功了。

[] 不是报错,而是代表:

Next.js 已经成功连接 MySQL,并且成功查询了 transactions 表,只是表里目前一条账单都没有。

如果看到:

复制代码
{"error":"查询账单失败"}

浏览器页面 + VS Code 终端报错截图 给chatgpt。

ps:不放心可以额外加一条测试(这个可做可不做)

进入 MySQL,然后执行:

复制代码
USE moneyweb;

再插入一条测试数据:

复制代码
INSERT INTO transactions
(type, amount, category, note, transaction_date)
VALUES
('expense', 25.00, '餐饮', '午饭', '2026-08-12');

然后查询一下:

复制代码
SELECT * FROM transactions;

如果能看到刚才这条记录,再回浏览器刷新:

复制代码
http://localhost:3000/api/transactions

正常情况下就不再是 [],而会出现类似:

复制代码
[
  {
    "id": 1,
    "type": "expense",
    "amount": "25.00",
    "category": "餐饮",
    "note": "午饭",
    "transaction_date": "2026-08-11T16:00:00.000Z",
    "created_at": "..."
  }
]

这里日期如果显示成前一天的 16:00:00.000Z,也先不用慌,这是 时区显示问题 ,后面做页面时再处理。

今日最终效果呈现

相关推荐
devpotato4 分钟前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情6738 分钟前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy32238 分钟前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物
九月要晚安1 小时前
达梦DW与AFC对比
数据库
实战派K8S&DB1 小时前
如何在内网配置 TiDB 数据库 Agent
数据库·人工智能·分布式·tidb
实战派K8S&DB1 小时前
《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》
运维·数据库·分布式·云原生·tidb·fastapi
SelectDB2 小时前
Apache Doris 5.0 年度版本前瞻(一):构建统一的多模湖仓实时分析平台
大数据·数据库·数据分析
小白学大数据2 小时前
超简单:用 Python 让 Excel 飞起来:用 openpyxl 把重复报表整理交给脚本
开发语言·数据库·python·excel
西索斯coding2 小时前
doubao-seed-2.1-turbo 调用一直 401 怎么办?pro 版同样的 Key 却正常——5 分钟排查定位指南
java·服务器·数据库·ai
袋鼠云数栈2 小时前
整库迁移与分库分表同步:批量数据搬迁的配置简化思路
jvm·数据库·oracle