You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用drizzle-seed按顺序填充MySQL会话表的时间字段

如何使用drizzle-seed按顺序填充MySQL会话表的时间字段

嘿,我来给你唠唠怎么用drizzle-seed给你的会话表按顺序填好created_at和started_at这俩时间字段!

首先得先把你的表结构补全好,确保时间字段的定义没问题,我给你补个完整示例:

import { mysqlTable, int, datetime } from 'drizzle-orm/mysql-core';

export const session = mysqlTable("session", {
    id: int("id").primaryKey().autoincrement(),
    userId: int("user_id").notNull(),
    created_at: datetime("created_at").notNull(), // 对应会话开始时间
    started_at: datetime("started_at").notNull()  // 你说的会话结束时间,这里命名有点容易混淆,之后可以考虑改成`ended_at`哦
});

接下来就是写seed脚本了,核心思路就是生成有明确先后顺序的时间戳,保证每个会话的开始时间(created_at)早于结束时间(started_at),不同会话的时间也能按你想要的逻辑排序。

我给你写个实用的示例脚本,比如放在src/db/seed.ts里:

import { drizzle } from 'drizzle-orm/mysql2';
import mysql from 'mysql2/promise';
import { session } from './schema'; // 记得导入你定义的表结构

// 先建立数据库连接
const connection = await mysql.createConnection({
    host: 'localhost',
    user: '你的数据库用户名',
    password: '你的数据库密码',
    database: '你的数据库名',
});

const db = drizzle(connection);

// 生成并插入会话数据的函数
const seedSessions = async () => {
    // 先设定一个基准时间,方便后续生成有序的时间
    const baseStartDate = new Date('2024-05-01T08:00:00');
    
    // 手动生成几条有明确时间顺序的会话数据
    const sessionsToInsert = [
        // 用户1的第一个会话:8点开始,8点30结束
        {
            userId: 1,
            created_at: new Date(baseStartDate.getTime()),
            started_at: new Date(baseStartDate.getTime() + 30 * 60 * 1000)
        },
        // 用户2的第一个会话:9点开始,9点20结束
        {
            userId: 2,
            created_at: new Date(baseStartDate.getTime() + 60 * 60 * 1000),
            started_at: new Date(baseStartDate.getTime() + 80 * 60 * 1000)
        },
        // 用户1的第二个会话:9点30开始,9点45结束
        {
            userId: 1,
            created_at: new Date(baseStartDate.getTime() + 90 * 60 * 1000),
            started_at: new Date(baseStartDate.getTime() + 105 * 60 * 1000)
        }
    ];

    // 批量插入这些数据
    await db.insert(session).values(sessionsToInsert);
    console.log('会话数据已经成功插进去啦!');

    // 别忘了关闭连接
    await connection.end();
};

// 执行seed函数,出错了就打出来
seedSessions().catch(err => {
    console.error('插数据的时候出问题啦:', err);
    process.exit(1);
});

要是你需要生成大量数据,不想手动一条一条写,可以整个循环工具函数自动生成,还能严格保证时间顺序,比如:

// 写个工具函数,给指定用户生成N条有序的会话数据
const generateUserSessions = (userId: number, sessionCount: number, startFrom: Date) => {
    const sessions = [];
    let currentTimestamp = startFrom.getTime();

    for (let i = 0; i < sessionCount; i++) {
        // 随机生成会话时长,比如10分钟到1小时之间
        const sessionDuration = 10 * 60 * 1000 + Math.random() * 50 * 60 * 1000;
        const createdAt = new Date(currentTimestamp);
        const endedAt = new Date(currentTimestamp + sessionDuration);
        
        sessions.push({
            userId,
            created_at: createdAt,
            started_at: endedAt // 这里还是按你原来的命名来
        });

        // 下一个会话在上一个结束后,随机等个5到20分钟再开始
        currentTimestamp = endedAt.getTime() + 5 * 60 * 1000 + Math.random() * 15 * 60 * 1000;
    }

    return sessions;
};

// 然后在seed函数里这么用:
// const user1Sessions = generateUserSessions(1, 6, baseStartDate);
// const user2Sessions = generateUserSessions(2, 4, new Date(baseStartDate.getTime() + 30 * 60 * 1000));
// const allSessions = [...user1Sessions, ...user2Sessions];
// await db.insert(session).values(allSessions);

最后就是运行这个seed脚本啦,你可以在package.json里加个脚本命令:

{
  "scripts": {
    "db:seed": "tsx src/db/seed.ts" // 用tsx跑TypeScript文件,要是你写的是JS就用node
  }
}

然后在终端里敲npm run db:seed或者yarn db:seed就能执行啦!

对了,还有个小提醒:如果你的时间字段允许为null,那seed的时候可以不用传,但你这里设的是notNull(),所以必须手动给每个记录传时间值,这样才能保证数据符合表结构要求哦。

备注:内容来源于stack exchange,提问作者KamielDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:39:31