Database

Model API

The ActiveRecord-style Model class generated by OmniSvelte for every .schema.ts file.

Model API

OmniSvelte generates a Model class for every .schema.ts file. The model wraps Drizzle ORM with an ActiveRecord-style API while still giving you a full escape hatch to raw Drizzle when needed.

Import

ts
import { Posts } from '$models/posts.model';    // single model
import { Posts, Users } from '$models';          // barrel — all models

Static methods

find(id)

ts
const post = await Posts.find(1);
// Returns Post | null

findMany(options?)

ts
const posts = await Posts.findMany({
  where:   { published: true },
  orderBy: { createdAt: 'desc' },
  limit:   10,
  offset:  0
});

create(data)

ts
const post = await Posts.create({
  title:   'Hello World',
  slug:    'hello-world',
  content: 'My first post',
  userId:  1
});
// Returns Post (with generated id, createdAt, updatedAt)

query() — fluent query builder

ts
const posts = await Posts
  .query()
  .where('published', true)
  .where('userId', userId)
  .orderBy('created_at', 'desc')
  .limit(10)
  .get();

drizzle()

Escape hatch to the raw Drizzle instance:

ts
const db = Posts.drizzle();
const result = await db
  .select({ id: posts.id, title: posts.title })
  .from(posts)
  .innerJoin(users, eq(posts.userId, users.id))
  .where(and(eq(posts.published, true), gt(posts.createdAt, cutoff)));

Instance methods

ts
const post = await Posts.find(1);
 
// Update
await post.update({ title: 'Updated Title' });
 
// Delete
await post.delete();
 
// Serialize (respects `hidden` config)
const json = post.toJSON();

Relationships

Defined in your schema or model file:

ts
// src/lib/posts.schema.ts
import { defineSchema, field, relation } from 'omni-svelte/schema';
import { userSchema } from './users.schema';
import { commentSchema } from './comments.schema';
 
export const postSchema = defineSchema('posts', {
  id: field.serial().primaryKey(),
  title: field.string(255).required(),
  authorId: field.integer().required(),
  author: relation.belongsTo(() => userSchema, { via: 'authorId' }),
  comments: relation.hasMany(() => commentSchema)
});

Use with:

ts
const post = await Posts.with(['author', 'comments']).find(1);
console.log(post.author.name);
console.log(post.comments.length);

Factories (testing)

ts
import { PostFactory } from '#lib/db/models/posts.factory';
 
// Generate unsaved plain object
const data = PostFactory.make({ published: true });
 
// Create and persist to DB
const post = await PostFactory.create({ userId: testUser.id });
 
// Create many
const posts = await PostFactory.createMany(5);

createModel (manual)

If you need a model without code generation:

ts
import { createModel } from 'omni-svelte/database';
import { db } from '$db';
import { posts } from '$schema';
 
export const PostModel = createModel(db, posts, {
  primaryKey: 'id',
  timestamps: true
});