之前拿到一个初始化数据库的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",