Gerador de esquemas Drizzle ORM a partir de SQL DDL (PostgreSQL, MySQL, SQLite)
Converta instruções SQL CREATE TABLE em esquemas fortemente tipados do Drizzle ORM com definições pgTable, mysqlTable e 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);Privacidade local sem upload
Toda a análise de SQL e a síntese de esquemas TypeScript são executadas 100% no sandbox do seu navegador local. A arquitetura do seu banco de dados nunca sai da sua máquina.
Precisão multi-dialeto para Drizzle
Suporte completo para pgTable (PostgreSQL), mysqlTable (MySQL) e sqliteTable (SQLite) com mapeamentos precisos de tipos, enums, índices e restrições.
Relações e inferências fortemente tipadas
Gera relations() tipadas do Drizzle ORM, tipos $inferSelect, $inferInsert e esquemas de validação opcionais drizzle-zod prontos para produção.