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

今日最终效果呈现

相关推荐
灯澜忆梦1 小时前
【MySQL12】进阶篇 | SQL优化
数据库·sql·mysql·性能优化
IvorySQL1 小时前
PostgreSQL 日报|PG18.5 回归测试崩溃问题(8 月 12 日)
大数据·数据库·人工智能·postgresql
ltl1 小时前
学习型查询优化器:Neo、Bao、Balsa 与 LLM-CBO
数据库
ltl2 小时前
持久内存退场之后:ZNS SSD 与下一代非易失内存
数据库
故乡dee云4 小时前
AWS 产品太多不会选?按“网站、数据库、文件、日志”4 类需求快速匹配
数据库·云计算·aws
曹牧6 小时前
C#:问号
前端·数据库·c#
奇树谦6 小时前
《现代 Key-Value 数据库原理:从 B+Tree 到 LSM Tree》-第五篇:现代数据库横向对比
数据库·lsm-tree
李白客6 小时前
分布式集群与数据库产业:从单机到集群的架构跃迁与市场重构
数据库·分布式·架构
福大大架构师每日一题7 小时前
Redis 8.10.0 正式发布:紧凑哈希、批量导入、备份恢复、流与时序能力全面升级
数据库·redis·哈希算法