feat(core): Add a migration for data stores (no-changelog) (#18045)

This commit is contained in:
Daria
2025-08-11 17:44:34 +03:00
committed by GitHub
parent d7d44f9e77
commit 81cbbc0cd5
5 changed files with 63 additions and 2 deletions

View File

@@ -0,0 +1,46 @@
import type { MigrationContext, ReversibleMigration } from '../migration-types';
const DATA_STORE_TABLE_NAME = 'data_store';
const DATA_STORE_COLUMN_TABLE_NAME = 'data_store_column';
export class CreateDataStoreTables1754475614601 implements ReversibleMigration {
async up({ schemaBuilder: { createTable, column } }: MigrationContext) {
await createTable(DATA_STORE_TABLE_NAME)
.withColumns(
column('id').varchar(36).primary,
column('name').varchar(128).notNull,
column('projectId').varchar(36).notNull,
column('sizeBytes').int.default(0).notNull,
)
.withForeignKey('projectId', {
tableName: 'project',
columnName: 'id',
onDelete: 'CASCADE',
})
.withUniqueConstraintOn(['projectId', 'name']).withTimestamps;
await createTable(DATA_STORE_COLUMN_TABLE_NAME)
.withColumns(
column('id').varchar(36).primary.notNull,
column('name').varchar(128).notNull,
column('type')
.varchar(32)
.notNull.comment(
'Expected: string, number, boolean, or date (not enforced as a constraint)',
),
column('index').int.notNull.comment('Column order, starting from 0 (0 = first column)'),
column('dataStoreId').varchar(36).notNull,
)
.withForeignKey('dataStoreId', {
tableName: DATA_STORE_TABLE_NAME,
columnName: 'id',
onDelete: 'CASCADE',
})
.withUniqueConstraintOn(['dataStoreId', 'name']).withTimestamps;
}
async down({ schemaBuilder: { dropTable } }: MigrationContext) {
await dropTable(DATA_STORE_COLUMN_TABLE_NAME);
await dropTable(DATA_STORE_TABLE_NAME);
}
}

View File

@@ -1,5 +1,5 @@
import type { TableForeignKeyOptions, TableIndexOptions, QueryRunner } from '@n8n/typeorm';
import { Table, TableColumn, TableForeignKey } from '@n8n/typeorm';
import { Table, TableColumn, TableForeignKey, TableUnique } from '@n8n/typeorm';
import { UnexpectedError } from 'n8n-workflow';
import LazyPromise from 'p-lazy';
@@ -24,6 +24,8 @@ export class CreateTable extends TableOperation {
private indices = new Set<TableIndexOptions>();
private uniqueConstraints = new Set<TableUnique>();
private foreignKeys = new Set<TableForeignKeyOptions>();
withColumns(...columns: Column[]) {
@@ -45,6 +47,12 @@ export class CreateTable extends TableOperation {
return this;
}
withUniqueConstraintOn(columnName: string | string[]) {
const columnNames = Array.isArray(columnName) ? columnName : [columnName];
this.uniqueConstraints.add(new TableUnique({ columnNames }));
return this;
}
withForeignKey(
columnName: string,
ref: {
@@ -69,12 +77,13 @@ export class CreateTable extends TableOperation {
async execute(queryRunner: QueryRunner) {
const { driver } = queryRunner.connection;
const { columns, tableName: name, prefix, indices, foreignKeys } = this;
const { columns, tableName: name, prefix, indices, uniqueConstraints, foreignKeys } = this;
return await queryRunner.createTable(
new Table({
name: `${prefix}${name}`,
columns: columns.map((c) => c.toOptions(driver)),
...(indices.size ? { indices: [...indices] } : {}),
...(uniqueConstraints.size ? { uniques: [...uniqueConstraints] } : {}),
...(foreignKeys.size ? { foreignKeys: [...foreignKeys] } : {}),
...('mysql' in driver ? { engine: 'InnoDB' } : {}),
}),

View File

@@ -89,6 +89,7 @@ import { DropRoleTable1745934666077 } from '../common/1745934666077-DropRoleTabl
import { AddProjectDescriptionColumn1747824239000 } from '../common/1747824239000-AddProjectDescriptionColumn';
import { AddLastActiveAtColumnToUser1750252139166 } from '../common/1750252139166-AddLastActiveAtColumnToUser';
import { AddInputsOutputsToTestCaseExecution1752669793000 } from '../common/1752669793000-AddInputsOutputsToTestCaseExecution';
import { CreateDataStoreTables1754475614601 } from '../common/1754475614601-CreateDataStoreTables';
import type { Migration } from '../migration-types';
import { UpdateParentFolderIdColumn1740445074052 } from '../mysqldb/1740445074052-UpdateParentFolderIdColumn';
@@ -185,4 +186,5 @@ export const mysqlMigrations: Migration[] = [
AddProjectDescriptionColumn1747824239000,
AddLastActiveAtColumnToUser1750252139166,
AddInputsOutputsToTestCaseExecution1752669793000,
CreateDataStoreTables1754475614601,
];

View File

@@ -89,6 +89,7 @@ import { AddWorkflowArchivedColumn1745934666076 } from '../common/1745934666076-
import { DropRoleTable1745934666077 } from '../common/1745934666077-DropRoleTable';
import { AddProjectDescriptionColumn1747824239000 } from '../common/1747824239000-AddProjectDescriptionColumn';
import { AddLastActiveAtColumnToUser1750252139166 } from '../common/1750252139166-AddLastActiveAtColumnToUser';
import { CreateDataStoreTables1754475614601 } from '../common/1754475614601-CreateDataStoreTables';
import type { Migration } from '../migration-types';
export const postgresMigrations: Migration[] = [
@@ -183,4 +184,5 @@ export const postgresMigrations: Migration[] = [
AddProjectDescriptionColumn1747824239000,
AddLastActiveAtColumnToUser1750252139166,
AddInputsOutputsToTestCaseExecution1752669793000,
CreateDataStoreTables1754475614601,
];

View File

@@ -86,6 +86,7 @@ import { DropRoleTable1745934666077 } from '../common/1745934666077-DropRoleTabl
import { AddProjectDescriptionColumn1747824239000 } from '../common/1747824239000-AddProjectDescriptionColumn';
import { AddLastActiveAtColumnToUser1750252139166 } from '../common/1750252139166-AddLastActiveAtColumnToUser';
import { AddInputsOutputsToTestCaseExecution1752669793000 } from '../common/1752669793000-AddInputsOutputsToTestCaseExecution';
import { CreateDataStoreTables1754475614601 } from '../common/1754475614601-CreateDataStoreTables';
import type { Migration } from '../migration-types';
const sqliteMigrations: Migration[] = [
@@ -177,6 +178,7 @@ const sqliteMigrations: Migration[] = [
AddProjectDescriptionColumn1747824239000,
AddLastActiveAtColumnToUser1750252139166,
AddInputsOutputsToTestCaseExecution1752669793000,
CreateDataStoreTables1754475614601,
];
export { sqliteMigrations };