43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import type { Kysely } from 'kysely';
|
|
import { sql } from 'kysely';
|
|
import type { Database } from '../types.js';
|
|
|
|
export async function up(db: Kysely<Database>): Promise<void> {
|
|
// Create person table
|
|
await db.schema
|
|
.createTable('person')
|
|
.addColumn('id', 'serial', (col) => col.primaryKey())
|
|
.addColumn('first_name', 'varchar(255)', (col) => col.notNull())
|
|
.addColumn('last_name', 'varchar(255)')
|
|
.addColumn('gender', 'varchar(10)', (col) =>
|
|
col.notNull().check(sql`gender IN ('man', 'woman', 'other')`)
|
|
)
|
|
.addColumn('created_at', 'timestamp', (col) =>
|
|
col.defaultTo(sql`CURRENT_TIMESTAMP`).notNull()
|
|
)
|
|
.addColumn('metadata', 'jsonb', (col) => col.notNull())
|
|
.execute();
|
|
|
|
// Create pet table
|
|
await db.schema
|
|
.createTable('pet')
|
|
.addColumn('id', 'serial', (col) => col.primaryKey())
|
|
.addColumn('name', 'varchar(255)', (col) => col.notNull())
|
|
.addColumn('owner_id', 'integer', (col) =>
|
|
col.notNull().references('person.id').onDelete('cascade')
|
|
)
|
|
.addColumn('species', 'varchar(10)', (col) =>
|
|
col.notNull().check(sql`species IN ('dog', 'cat')`)
|
|
)
|
|
.execute();
|
|
|
|
// Create index on pet.owner_id for better query performance
|
|
await db.schema.createIndex('pet_owner_id_index').on('pet').column('owner_id').execute();
|
|
}
|
|
|
|
export async function down(db: Kysely<Database>): Promise<void> {
|
|
// Drop tables in reverse order (drop dependent tables first)
|
|
await db.schema.dropTable('pet').execute();
|
|
await db.schema.dropTable('person').execute();
|
|
}
|