Node.js+Drizzle+Postgresql实现增删改查
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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)