n8n/packages/@n8n/db/AGENTS.md
Charlie Kolb 69a62e0906
docs: Add migration timestamp guidance to @n8n/db AGENTS.md (no-changelog) (#28444)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-04-14 10:40:42 +00:00

45 lines
1.2 KiB
Markdown

# AGENTS.md
Extra information specific to the `@n8n/db` package.
## Creating Migrations
Migration files are named `{TIMESTAMP}-{DescriptiveName}.ts`. The timestamp
must be the **exact** Unix millisecond timestamp at the time of creation — do
not round or fabricate a value. Use `Date.now()` in a Node REPL or
`date +%s%3N` in a shell (GNU `date`) to generate it.
## Migration DSL
### UUID Primary Keys
Do **not** use `autoGenerate` or `autoGenerate2` on UUID columns. Both cause
TypeORM to emit `DEFAULT uuid_generate_v4()` in PostgreSQL, which requires the
`uuid-ossp` extension in the `public` schema. This fails on managed Postgres
services like Supabase where the extension lives in a different schema.
**Instead**, generate UUIDs at the application level:
Migration:
```typescript
column('id').uuid.primary.notNull,
```
Entity:
```typescript
import { randomUUID } from 'node:crypto';
import { BeforeInsert, PrimaryColumn } from '@n8n/typeorm';
@PrimaryColumn('uuid')
id: string;
@BeforeInsert()
generateId() {
if (!this.id) {
this.id = randomUUID();
}
}
```
`autoGenerate` / `autoGenerate2` are fine for **integer** columns (they use
`serial` / `GENERATED BY DEFAULT AS IDENTITY` respectively).