nextjs初探之使用drizzle-orm生成schema

383 阅读1分钟

之前拿到一个初始化数据库的sql语句,想把sql转成schema来初始化。

找了下工具没有发现,然后用AI来转的。

这两天看了下mybatis,然后去找了下Drizzle,看看里面有没有对应的,然后发现了introspect。

所以就来看看效果还不错,贴出来存个档。

大致的初始化的流程

sql初始化数据库 -> 使用Drizzle链接数据库 -> 生成默认的schema -> 后期有修改schema,使用命令推数据库。

先看下自己写的和生成的效果,以一个表为例子(生成的shcema没有引入bigint,手动添加的)

生成的schema

import { mysqlTable, bigint, index, unique, int, timestamp, varchar, tinyint, decimal, datetime, text } from "drizzle-orm/mysql-core"
// import { sql } from "drizzle-orm"


export const mmallCart = mysqlTable("mmall_cart", {
	id: int("id").autoincrement().notNull(),
	userId: int("userId").notNull(),
	productId: int("productId"),
	quantity: int("quantity"),
	checked: int("checked"),
	createTime: timestamp("createTime", { mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updateTime: timestamp("updateTime", { mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => {
	return {
		userIdIdx: index("mmall_cart__user_id__idx").on(table.userId),
		mmallCartUserIdUnique: unique("mmall_cart__user_id__unique").on(table.userId),
	}
});

自己手写的

import { sql } from 'drizzle-orm';
import {
  int, mysqlTable, timestamp, index, uniqueIndex,
} from 'drizzle-orm/mysql-core';

const mmallCart = mysqlTable(
  'mmall_cart',
  {
    id: int('id').autoincrement().primaryKey().notNull(),
    userId: int('userId').notNull(),
    productId: int('productId'),
    quantity: int('quantity'),
    checked: int('checked'),
    createTime: timestamp('createTime').default(sql`now()`).notNull(),
    updateTime: timestamp('updateTime').default(sql`now()`).notNull(),
  },
  // 调整索引命名以保持一致
  (cart) => ({
    uniqueUserIdIndex: uniqueIndex('mmall_cart__user_id__unique').on(
      cart.userId
    ),
    userIdIndex: index('mmall_cart__user_id__idx').on(cart.userId),
  })
);

export default mmallCart;
export {mmallCart}

发现生成的是不是还好一点~

命令

package.json里

    "db:introspect": "drizzle-kit introspect:mysql --config=drizzle.config.ts",