基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
使用 Drizzle ORM 连接 OceanBase 数据库
更新时间:2026-04-09 14:12:04
功能适用性
Drizzle ORM 适用于 OceanBase 数据库 MySQL 模式。
Drizzle ORM 是一个轻量级、类型安全的 TypeScript ORM。本文将介绍如何使用 Drizzle ORM 连接 OceanBase 数据库的 MySQL 模式。
前提条件
- 已安装 Node.js 16.0.0 或更高版本
- 已安装 npm 或 yarn 包管理器
- 已部署 OceanBase 数据库并且创建了 MySQL 模式租户
操作步骤
- 检查 Node.js 和 npm 版本
- 安装必要的依赖
- 获取 OceanBase 数据库连接信息
- 创建并配置项目
- 运行示例程序
步骤一:检查 Node.js 和 npm 版本
打开终端,运行以下命令检查 Node.js 和 npm 的版本:
node -v
npm -v
步骤二:安装必要的依赖
mkdir drizzle-oceanbase-demo
cd drizzle-oceanbase-demo
npm init -y
npm install drizzle-orm mysql2
npm install -D typescript @types/node ts-node
npx tsc --init
步骤二:配置数据库连接
在项目根目录创建 .env 文件,填写数据库连接信息:
DB_HOST=your_host
DB_PORT=2881
DB_USER=your_username
DB_PASSWORD=your_password
DB_NAME=your_database
步骤三:获取 OceanBase 数据库连接信息
联系 OceanBase 数据库部署人员或者管理员获取相应的数据库连接信息。
mysql -h$host -P$port -u$user_name -p$password -D$database_name
参数说明:
$host:提供 OceanBase 数据库连接 IP$port:提供 OceanBase 数据库连接端口$database_name:需要访问的数据库名称$user_name:提供租户的连接账户$password:提供账户密码
步骤三:定义数据表模型
创建 src/db/schema.ts:
import { mysqlTable, int, varchar, timestamp, index } from 'drizzle-orm/mysql-core';
export const users = mysqlTable('users', {
id: int('id').primaryKey().autoincrement(),
username: varchar('username', { length: 255 }).notNull(),
email: varchar('email', { length: 255 }).notNull().unique(),
passwordHash: varchar('password_hash', { length: 255 }).notNull(),
createdAt: timestamp('created_at').defaultNow().notNull(),
updatedAt: timestamp('updated_at').defaultNow().onUpdateNow().notNull(),
}, (table) => ({
// 添加 email 字段的索引
emailIdx: index('email_idx').on(table.email),
}));
在 OceanBase 数据库中创建表:
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL
);
步骤四:创建数据库连接
创建 src/db/index.ts:
import { drizzle } from 'drizzle-orm/mysql2';
import mysql from 'mysql2/promise';
import * as schema from './schema';
import * as dotenv from 'dotenv';
// Load environment variables
dotenv.config();
const poolConnection = mysql.createPool({
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT || '2881'),
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
timezone: '+08:00',
// Add these options for better compatibility
multipleStatements: true,
supportBigNumbers: true,
bigNumberStrings: true
});
console.log('Connecting to database at:', {
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
database: process.env.DB_NAME
});
export const db = drizzle(poolConnection, {
schema,
mode: 'default'
});
步骤五:CRUD 操作示例
创建 src/index.ts:
import { db } from './db';
import { users } from './db/schema';
import { eq } from 'drizzle-orm';
async function main() {
try {
// Test the connection first
await db.select().from(users).limit(1);
console.log('Successfully connected to the database');
// Create user
const insertResult = await db.insert(users).values({
username: 'testuser',
email: 'test@example.com',
passwordHash: 'hashed_password',
});
console.log('Insert result:', insertResult);
// Get the inserted user
const [newUser] = await db.select().from(users).where(eq(users.email, 'test@example.com'));
console.log('Created user:', newUser);
// Query user
const [user] = await db.select().from(users).where(eq(users.id, newUser.id));
console.log('Retrieved user:', user);
// Update user
const updateResult = await db.update(users)
.set({ email: 'new.email@example.com' })
.where(eq(users.id, newUser.id));
console.log('Update result:', updateResult);
// Get the updated user
const [updatedUser] = await db.select().from(users).where(eq(users.id, newUser.id));
console.log('Updated user:', updatedUser);
// Delete user
const deleteResult = await db.delete(users)
.where(eq(users.id, newUser.id));
console.log('Delete result:', deleteResult);
// Verify deletion
const [deletedUser] = await db.select().from(users).where(eq(users.id, newUser.id));
console.log('User after deletion:', deletedUser || 'User not found');
} catch (error) {
console.error('Database error:', error);
}
}
main().catch(console.error);
运行示例
npx ts-node src/index.ts