1.工具、环境

Node.js: 22.19.0
Postgresql: 18
Drizzle
vscode

2.数据库部分Postgresql

打开数据库连接工具:pdAdmin。
双击默认的”Servers“,如果你有其他的服务,也可以。
在这里插入图片描述
然后,双击默认的”PostgreSQL 18“

在这里插入图片描述

输入默认的密码,点击”确定“

在这里插入图片描述
右击”数据库“,选择”创建“,再选择”数据库“。
在这里插入图片描述
数据库名为:demo,然后点击”保存“
在这里插入图片描述
右击刚才创建的数据库名demo。再点击”查询工具“。
在这里插入图片描述
参考sql语句如下:

-- 创建用户表
CREATE TABLE IF NOT EXISTS users (
  id SERIAL PRIMARY KEY,       -- 自增主键
  username VARCHAR(50) NOT NULL, -- 用户名
  email VARCHAR(100) UNIQUE NOT NULL, -- 邮箱(唯一)
  age INT,                     -- 年龄
  create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 创建时间
);

-- 插入 3 条用户数据
INSERT INTO users (username, email, age)
VALUES
  ('zhangsan', 'zhangsan@example.com', 22),
  ('lisi', 'lisi@example.com', 25),
  ('wangwu', 'wangwu@example.com', 30);
  
-- 查看表结构(可选)
SELECT * FROM users;

执行完,结果如下:
在这里插入图片描述

3. 初始化Node.js项目

新建文件夹,例如 drizzle-pg-crud,然后用vscode打开这个文件夹。
然后,在终端打开这个项目。
在这里插入图片描述
在根目录执行下面代码初始化项目

# 初始化 package.json,一路回车默认即可
npm init -y

执行完如下:

在这里插入图片描述

然后安装核心依赖:

pg:PostgreSQL 官方 Node 驱动
drizzle-orm:Drizzle ORM 核心库

npm install pg drizzle-orm

在这里插入图片描述
再安装开发依赖:
drizzle-kit:Drizzle 工具集(迁移、代码生成)
dotenv:读取环境变量(存放数据库账号密码)

npm install -D drizzle-kit dotenv

在这里插入图片描述

目录规划如下(后面慢慢创建):

drizzle-pg-crud/
├── .env                # 环境变量(数据库配置)
├── package.json
├── drizzle/            # 数据库迁移文件(自动生成)
├── src/
│   ├── db/
│   │   ├── index.js    # 数据库连接 + Drizzle 实例
│   │   └── schema.js   # Drizzle 表结构定义
│   └── crud.js         # 增删改查业务逻辑
└── drizzle.config.js   # Drizzle 配置文件

4.基础配置编写

4.1 编写环境变量 .env

项目根目录新建 .env 文件,填入你的 PostgreSQL 连接信息:

在这里插入图片描述

在这里插入图片描述
数据库链接信息如下:

# PostgreSQL 连接配置
DB_HOST=localhost
DB_PORT=5433
DB_USER=postgres        # 默认管理员用户名
DB_PASSWORD=123456      # 安装PG时设置的密码
DB_NAME=demo    # 刚才创建的数据库名

注意上面的地址、端口、用户名、密码和数据库名都填成你实际的。

在这里插入图片描述

4.2 Drizzle 全局配置 drizzle.config.js

根目录新建 drizzle.config.js,用于迁移、工具识别表结构:

代码如下:

import "dotenv/config";
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  // 表结构文件路径
  schema: "./src/db/schema.js",
  // 迁移文件存放目录
  out: "./drizzle",
  // 数据库类型:postgresql
  dialect: "postgresql",
  // 数据库连接字符串
  dbCredentials: {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
  },
});

在这里插入图片描述

4.3 定义表结构

Drizzle 用代码映射数据库表,和我们 pgAdmin 创建的 users 表一一对应:
先创建目录src。
再在src目录下创建db文件夹。
然后,在db文件夹下创建schema.js文件

参考代码如下:

import { pgTable, serial, varchar, integer, timestamp } from "drizzle-orm/pg-core";

// 定义 users 表,和数据库表结构对齐
export const users = pgTable("users", {
  id: serial("id").primaryKey(), // 自增主键
  username: varchar("username", { length: 50 }).notNull(), // 用户名
  email: varchar("email", { length: 100 }).notNull().unique(), // 唯一邮箱
  age: integer("age"), // 年龄(可为空)
  createAt: timestamp("create_at").defaultNow(), // 创建时间,默认当前时间
});

创建完如下:
在这里插入图片描述

4.4 数据连接

在目录src/db/目录下,创建index.js,用来连接数据库。

import "dotenv/config";
import { Pool } from "pg";
import { drizzle } from "drizzle-orm/node-postgres";
import * as schema from "./schema.js";

// 创建连接池
const pool = new Pool({
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
});

// 测试连接
async function testConnection() {
  try {
    const res = await pool.query("SELECT NOW() as current_time");
    console.log("✅ 数据库连接成功!当前时间:", res.rows[0].current_time);
  } catch (err) {
    console.error("❌ 数据库连接失败:", err.message);
    console.error("请检查:1. PostgreSQL 服务是否启动 2. .env 配置是否正确");
    process.exit(1); // 连接失败直接退出程序
  }
}

// 运行测试
await testConnection();

export const db = drizzle(pool, { schema });

在这里插入图片描述

5. 实现增删改查

在src目录下,新建crud.js文件

参考代码如下:

import { db } from "./db/index.js";
import { users } from "./db/schema.js";
import { eq, like, asc, desc } from "drizzle-orm";

// ===================== 1. 新增数据(Create)=====================
export async function createUser(userInfo) {
  const result = await db.insert(users).values(userInfo).returning();
  console.log("新增成功:", result[0]);
  return result[0];
}

// ===================== 2. 查询数据(Read)=====================
// 2.1 查询所有用户
export async function findAllUsers() {
  const list = await db.select().from(users).orderBy(desc(users.createAt));
  console.log("所有用户:", list);
  return list;
}

// 2.2 根据 ID 查询单个用户
export async function findUserById(id) {
  const user = await db.select().from(users).where(eq(users.id, id));
  console.log("根据ID查询:", user[0] || "无数据");
  return user[0];
}

// 2.3 模糊查询(根据用户名)
export async function findUserByName(name) {
  const list = await db.select().from(users).where(like(users.username, `%${name}%`));
  console.log("模糊查询结果:", list);
  return list;
}

// ===================== 3. 修改数据(Update)=====================
// 根据 ID 更新用户信息
export async function updateUser(id, updateData) {
  const result = await db
    .update(users)
    .set(updateData)
    .where(eq(users.id, id))
    .returning();
  console.log("更新成功:", result[0]);
  return result[0];
}

// ===================== 4. 删除数据(Delete)=====================
// 根据 ID 删除用户
export async function deleteUser(id) {
  const result = await db.delete(users).where(eq(users.id, id)).returning();
  console.log("删除成功:", result[0] || "无此数据");
  return result[0];
}

// 测试入口:按顺序执行 CRUD 流程
async function runTest() {
  // 1. 新增
  await createUser({
    username: "张三",
    email: "zhangsan@test.com",
    age: 22,
  });

  // 2. 查询全部
  await findAllUsers();

  // 3. 根据ID查询(假设新增后ID为1,根据实际情况修改)
  await findUserById(1);

  // 4. 修改数据
  await updateUser(1, { age: 25, username: "张三_改名" });

  // 5. 模糊查询
  await findUserByName("张三");

  // 6. 删除数据
  await deleteUser(1);
}

// 执行测试
runTest();

在这里插入图片描述
注意,crud.js和上面的index.js 还有schema.js不是同一个目录。

6. 执行测试

回答跟目录, 打开package.json,修改两处地方。

在这里插入图片描述

整个的参考代码如下:

{
  "name": "drizzle-pg-crud",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "dev": "node src/crud.js",  
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "drizzle-orm": "^0.45.2",
    "pg": "^8.21.0"
  },
  "devDependencies": {
    "dotenv": "^17.4.2",
    "drizzle-kit": "^0.31.10"
  }
}

然后,在跟目录执行:

npm run dev

就可以看到执行了增删改查了。
在这里插入图片描述

在这里插入图片描述

本项目参考代码如下:

通过网盘分享的文件:drizzle-pg-crud.zip链接:
https://pan.baidu.com/s/1OS2B7_5dCYwfbjXZzA75CQ?pwd=cfxk

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐