SQL zu Drizzle

SQL-DDL zu Drizzle-ORM-Schema-Generator (PostgreSQL, MySQL, SQLite)

Konvertieren Sie SQL CREATE TABLE-Anweisungen in typsichere Drizzle ORM-Schemas mit pgTable-, mysqlTable- und sqliteTable-Definitionen.

Voreinstellungen:
Datenbank-Dialekt:
Schema-Syntax:
Spaltenschlüssel:
SQL-DDL-AnweisungenPostgreSQL
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);
Geparste Tabellen5Eindeutige Schemamodelle
Konvertierte Spalten34Typisierte Tabellenattribute
FremdschlüsselPostgreSQL
4Relationale Verweise & Links

100% lokale Privatsphäre ohne Upload

Das gesamte SQL-Parsing und die TypeScript-Schemasynthese laufen zu 100% in der Sandbox Ihres lokalen Browsers. Ihre Datenbankarchitektur verlässt niemals Ihren Rechner.

Präzision für mehrere Drizzle-Dialekte

Vollständige Unterstützung für pgTable (PostgreSQL), mysqlTable (MySQL) und sqliteTable (SQLite) mit präzisen Typzuordnungen, Enums, Indizes und Constraints.

Typsichere Relationen & Inferenzen

Generiert typsichere relations(), $inferSelect, $inferInsert-Typen sowie optionale drizzle-zod-Validierungsschemas für den Produktionseinsatz.

Technische Referenz & Architektur-Leitfaden

SQL-DDL zu Drizzle ORM Schema-Generator (PostgreSQL, MySQL, SQLite) — Referenz-Leitfaden

Konvertieren Sie SQL CREATE TABLE-Anweisungen in typsichere Drizzle ORM-Schemas mit pgTable-, mysqlTable- und sqliteTable-Definitionen.

Wichtige Parameter & Steuerelemente

Ziel-Datenbankdialekt (Target Dialect)Enum ('postgresql' | 'mysql' | 'sqlite')

Bestimmt den Zieldialekt von Drizzle und das zu importierende Kernpaket (drizzle-orm/pg-core, drizzle-orm/mysql-core oder drizzle-orm/sqlite-core).

Standard: postgresql
Spaltenbezeichner-Schreibweise (Column Casing)Enum ('camelCase' | 'snake_case')

Steuert, ob TypeScript-Eigenschaftsnamen in idiomatische camelCase-Bezeichner transformiert werden oder das Datenbank-snake_case beibehalten.

Standard: camelCase
Typinferenz generieren ($inferSelect / $inferInsert)Boolean

Erzeugt begleitende TypeScript-Typdeklarationen für Select- und Insert-Abfragen (typeof table.$inferSelect und typeof table.$inferInsert).

Standard: true
Export-Syntax (Export Syntax)Enum ('named' | 'schema-object')

Legt fest, ob Tabellen als separate benannte Konstanten (export const users = ...) oder gebündelt in einem Schema-Container-Objekt exportiert werden.

Standard: named

Profi-Tipps & Best Practices

SQL-REFERENCES-Klauseln werden in

SQL-REFERENCES-Klauseln werden in .references(() => targetTable.id) Pfeilfunktions-Callbacks umgewandelt, um zirkuläre Importprobleme zur Laufzeit zu verhindern.

PostgreSQL pgEnum-Unterstützung

CREATE TYPE ... AS ENUM-Anweisungen in Postgres werden in eigenständige pgEnum()-Definitionen extrahiert und bieten vollständige TypeScript-Union-Typsicherheit.

Zusammengesetzte Primary Keys und

Zusammengesetzte Primary Keys und mehrspaltige Indizes werden im dritten Tabellen-Callback (table) => [...] präzise zusammengefasst.

Häufige Fallstricke & Fehlerbehebung

Syntaxfehler durch herstellerspezifische DDL-Schlüsselwörter

Entfernen Sie enginespezifische Klauseln wie ENGINE=InnoDB oder Tabellenraum-Direktiven und stellen Sie sicher, dass gültige Standard-CREATE-TABLE-Statements vorliegen.

Zirkuläre Abhängigkeiten zwischen Fremdschlüsseltabellen

Nutzen Sie Drizzles Lazy-Evaluation-Syntax .references(() => otherTable.id) oder lagern Sie komplexe Beziehungsdefinitionen in relations()-Dateien aus.

Häufig gestellte Fragen (FAQ)

Wie werden Primärschlüssel und Auto-Increment-Felder abgebildet?▼

In PostgreSQL werden SERIAL und BIGSERIAL auf serial() bzw. bigserial() abgebildet. In MySQL wird AUTO_INCREMENT zu .autoincrement(), und in SQLite wird INTEGER PRIMARY KEY zu integer().primaryKey({ autoIncrement: true }).

Sind die generierten Schemas mit drizzle-kit kompatibel?▼

Ja, der generierte TypeScript-Code folgt strikt den offiziellen Konventionen von Drizzle ORM und funktioniert nahtlos mit drizzle-kit push, generate und Drizzle Studio.

Wie werden NULL-Werte und DEFAULT-Ausdrücke verarbeitet?▼

Spalten ohne NOT NULL bleiben standardmäßig nullable. NOT NULL-Attribute erhalten die Kette .notNull(), und SQL-DEFAULT-Werte werden in .default(...) oder $defaultFn() übersetzt.

Werden SQL-Tabellendaten oder Schemadefinitionen an Server übertragen?▼

Nein. Sämtliche Analyse-, Tokenisierungs- und Codegenerierungsschritte laufen zu 100 % lokal in Ihrem Browser ab. Es findet keinerlei Serverkommunikation statt.

Verwandte Werkzeuge & Dienstprogramme

Alle Werkzeuge →