记账网站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,也先不用慌,这是 时区显示问题 ,后面做页面时再处理。

今日最终效果呈现

相关推荐
这个DBA有点耶4 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G4 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备4 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远4 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
2601_962218614 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren4 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
Terra.K4 天前
后端+AIAGENT项目开发指南
后端·agent·个人开发
于平安4 天前
MySQL-触发器
数据库·mysql
白远山4 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro4 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理