All checks were successful
CI / Test (1.24) (push) Successful in -27m23s
CI / Test (1.25) (push) Successful in -27m16s
CI / Build (push) Successful in -27m40s
CI / Lint (push) Successful in -27m29s
Release / Build and Release (push) Successful in -27m21s
Integration Tests / Integration Tests (push) Successful in -27m17s
* Implement SanitizeFilename function to clean identifiers * Remove quotes, comments, and invalid characters from filenames * Update filename generation in writers to use sanitized names
Drizzle Writer
Generates TypeScript/JavaScript files with Drizzle ORM schema definitions from database schema information.
Overview
The Drizzle Writer converts RelSpec's internal database model representation into TypeScript source code with Drizzle ORM schema definitions, including tables, columns, relationships, and constraints.
Features
- Generates Drizzle-compatible TypeScript schema
- Supports PostgreSQL and MySQL schemas
- Creates table definitions with proper column types
- Generates relationship definitions
- Handles constraints and indexes
- Outputs formatted TypeScript code
Usage
Basic Example
package main
import (
"git.warky.dev/wdevs/relspecgo/pkg/models"
"git.warky.dev/wdevs/relspecgo/pkg/writers"
"git.warky.dev/wdevs/relspecgo/pkg/writers/drizzle"
)
func main() {
options := &writers.WriterOptions{
OutputPath: "schema.ts",
Metadata: map[string]interface{}{
"database_type": "postgresql", // or "mysql"
},
}
writer := drizzle.NewWriter(options)
err := writer.WriteDatabase(db)
if err != nil {
panic(err)
}
}
CLI Examples
# Generate Drizzle schema from PostgreSQL database
relspec --input pgsql \
--conn "postgres://localhost/mydb" \
--output drizzle \
--out-file schema.ts
# Convert GORM models to Drizzle
relspec --input gorm --in-file models.go --output drizzle --out-file schema.ts
# Convert JSON schema to Drizzle
relspec --input json --in-file schema.json --output drizzle --out-file db/schema.ts
Generated Code Example
import { pgTable, serial, varchar, text, timestamp, integer } from 'drizzle-orm/pg-core';
import { relations } from 'drizzle-orm';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
username: varchar('username', { length: 50 }).notNull().unique(),
email: varchar('email', { length: 100 }).notNull(),
bio: text('bio'),
createdAt: timestamp('created_at').notNull().defaultNow(),
});
export const posts = pgTable('posts', {
id: serial('id').primaryKey(),
userId: integer('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
title: varchar('title', { length: 200 }).notNull(),
content: text('content'),
});
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}));
export const postsRelations = relations(posts, ({ one }) => ({
user: one(users, {
fields: [posts.userId],
references: [users.id],
}),
}));
Supported Column Types
PostgreSQL
serial,bigserial- Auto-increment integersinteger,bigint,smallint- Integer typesvarchar,text- String typesboolean- Booleantimestamp,date,time- Date/time typesjson,jsonb- JSON typesuuid- UUID type
MySQL
int,bigint,smallint- Integer typesvarchar,text- String typesboolean- Booleandatetime,timestamp- Date/time typesjson- JSON type
Notes
- Table names and column names are preserved as-is
- Relationships are generated as separate relation definitions
- Constraint actions (CASCADE, etc.) are included in references
- Schema names other than 'public' are supported
- Output is formatted TypeScript code