Générateur de schémas Drizzle ORM à partir de SQL DDL (PostgreSQL, MySQL, SQLite)
Convertissez vos instructions SQL CREATE TABLE en schémas Drizzle ORM fortement typés avec des définitions pgTable, mysqlTable et sqliteTable.
import {
boolean,
index,
integer,
jsonb,
numeric,
pgEnum,
pgTable,
serial,
text,
timestamp,
uniqueIndex,
uuid,
varchar
} from 'drizzle-orm/pg-core';
import { relations } from 'drizzle-orm';
import { createSelectSchema, createInsertSchema } from 'drizzle-zod';
// Enums
export const userRoleEnum = pgEnum('user_role', ['CUSTOMER', 'ADMIN', 'VENDOR']);
export const orderStatusEnum = pgEnum('order_status', ['PENDING', 'PAID', 'PROCESSING', 'SHIPPED', 'DELIVERED', 'CANCELLED']);
// Tables
export const users = pgTable('users', {
id: uuid('id').defaultRandom().primaryKey(),
email: varchar('email', { length: 255 }).notNull().unique(),
fullName: varchar('full_name', { length: 120 }),
role: userRoleEnum('role').notNull().default('CUSTOMER'),
isActive: boolean('is_active').notNull().default(true),
metadata: jsonb('metadata'),
createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
updatedAt: timestamp('updated_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
});
export const userProfiles = pgTable('user_profiles', {
id: uuid('id').defaultRandom().primaryKey(),
userId: uuid('user_id').notNull().unique().references(() => users.id, { onDelete: 'cascade' }),
avatarUrl: varchar('avatar_url', { length: 500 }),
phone: varchar('phone', { length: 30 }),
shippingAddress: text('shipping_address'),
taxIdentifier: varchar('tax_identifier', { length: 50 }),
});
export const products = pgTable('products', {
id: serial('id').primaryKey(),
sku: varchar('sku', { length: 64 }).notNull().unique(),
title: varchar('title', { length: 200 }).notNull(),
description: text('description'),
price: numeric('price', { precision: 10, scale: 2 }).notNull().default(0.00),
inventory: integer('inventory').notNull().default(0),
isPublished: boolean('is_published').notNull().default(true),
createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
}, (table) => [
index('idx_products_sku').on(table.sku)
]);
export const orders = pgTable('orders', {
id: uuid('id').defaultRandom().primaryKey(),
customerId: uuid('customer_id').notNull().references(() => users.id, { onDelete: 'restrict' }),
orderNumber: varchar('order_number', { length: 64 }).notNull().unique(),
status: orderStatusEnum('status').notNull().default('PENDING'),
totalAmount: numeric('total_amount', { precision: 12, scale: 2 }).notNull().default(0.00),
notes: text('notes'),
createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
}, (table) => [
index('idx_orders_customer').on(table.customerId)
]);
export const orderItems = pgTable('order_items', {
id: serial('id').primaryKey(),
orderId: uuid('order_id').notNull().references(() => orders.id, { onDelete: 'cascade' }),
productId: integer('product_id').notNull().references(() => products.id, { onDelete: 'restrict' }),
quantity: integer('quantity').notNull().default(1),
unitPrice: numeric('unit_price', { precision: 10, scale: 2 }).notNull(),
}, (table) => [
uniqueIndex('uq_order_product').on(table.orderId, table.productId)
]);
// Relations
export const usersRelations = relations(users, ({ many }) => ({
userProfileses: many(userProfiles),
orderses: many(orders),
}));
export const userProfilesRelations = relations(userProfiles, ({ one }) => ({
user: one(users, {
fields: [userProfiles.userId],
references: [users.id],
}),
}));
export const productsRelations = relations(products, ({ many }) => ({
orderItemses: many(orderItems),
}));
export const ordersRelations = relations(orders, ({ one, many }) => ({
customer: one(users, {
fields: [orders.customerId],
references: [users.id],
}),
orderItemses: many(orderItems),
}));
export const orderItemsRelations = relations(orderItems, ({ one }) => ({
order: one(orders, {
fields: [orderItems.orderId],
references: [orders.id],
}),
product: one(products, {
fields: [orderItems.productId],
references: [products.id],
}),
}));
// TypeScript Inferred Types
export type User = typeof users.$inferSelect;
export type NewUser = typeof users.$inferInsert;
export type UserProfile = typeof userProfiles.$inferSelect;
export type NewUserProfile = typeof userProfiles.$inferInsert;
export type Product = typeof products.$inferSelect;
export type NewProduct = typeof products.$inferInsert;
export type Order = typeof orders.$inferSelect;
export type NewOrder = typeof orders.$inferInsert;
export type OrderItem = typeof orderItems.$inferSelect;
export type NewOrderItem = typeof orderItems.$inferInsert;
// Drizzle-Zod Schemas
export const selectUserSchema = createSelectSchema(users);
export const insertUserSchema = createInsertSchema(users);
export const selectUserProfileSchema = createSelectSchema(userProfiles);
export const insertUserProfileSchema = createInsertSchema(userProfiles);
export const selectProductSchema = createSelectSchema(products);
export const insertProductSchema = createInsertSchema(products);
export const selectOrderSchema = createSelectSchema(orders);
export const insertOrderSchema = createInsertSchema(orders);
export const selectOrderItemSchema = createSelectSchema(orderItems);
export const insertOrderItemSchema = createInsertSchema(orderItems);Confidentialité locale sans téléversement
L'analyse SQL et la synthèse de schémas TypeScript s'exécutent à 100% dans le bac à sable de votre navigateur local. L'architecture de votre base de données ne quitte jamais votre machine.
Précision multi-dialecte Drizzle
Prise en charge complète de pgTable (PostgreSQL), mysqlTable (MySQL) et sqliteTable (SQLite) avec mappages précis des types, énumérations, index et contraintes.
Relations et inférences sécurisées par le typage
Génère des relations() typées Drizzle ORM, des types $inferSelect, $inferInsert et des schémas de validation drizzle-zod prêts pour la production.