如何使用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
相关产品推荐
相关产品推荐

