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

今日最终效果呈现

相关推荐
数据库小学妹6 小时前
国产数据库怎么选?兼容、迁移、核心案例与融合架构四道关
数据库·架构·国产数据库·数据库迁移·融合数据库
IvorySQL7 小时前
PostgreSQL 日报| PgBouncer 修复三个 CVE 漏洞(10 月 15 日)
数据库·postgresql·区块链
饺子大魔王的男人7 小时前
后台表格、查询、流程总在重复写?我用ToolJet把PostgreSQL直接做成可远程访问的业务系统
数据库·postgresql
Gauss松鼠会7 小时前
高斯数据库(openGauss)的物理存储结构
运维·服务器·数据库·sql·opengauss·经验总结
杨云龙UP8 小时前
PostgreSQL 18.4 数据库整库迁移实战:pg_dump 备份与 pg_restore 恢复完整操作手册
运维·服务器·数据库·postgresql·pg_dump·pg_restore
AOI小白新手上路8 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库
凯歌的博客9 小时前
DuckDB 是一款进程内的分析型数据库
数据库·ai编程
dishugj9 小时前
Oracle物理体系结构
数据库·oracle
北亚数据恢复9 小时前
【数据库数据恢复】NDF文件变0KB、数据库损坏?超大数据库数据恢复案例
数据库·oracle