Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
export type Groups =
| 'addColumn'
| 'addConstraint'
| 'alterType'
| 'createIndex'
| 'createTable'
| 'createType'
| 'disableRowSecurity'
| 'dropColumn'
| 'dropConstraint'
| 'dropIndex'
| 'dropTable'
| 'dropType'
| 'notNull'
| 'setDefault'

/**
* Convert an "ADD COLUMN" statement to an "ALTER COLUMN" statement
Expand Down Expand Up @@ -44,14 +52,53 @@ export const groupUpSQLStatements = (list: string[]): Record<Groups, string[]> =

notNull: 'NOT NULL',
// example: ALTER TABLE "pages_blocks_my_block" ALTER COLUMN "person_id" SET NOT NULL;

createType: 'CREATE TYPE',
// example: CREATE TYPE "public"."enum__pages_v_published_locale" AS ENUM('en', 'es');

alterType: 'ALTER TYPE',
// example: ALTER TYPE "public"."enum_pages_blocks_cta" ADD VALUE 'copy';

createTable: 'CREATE TABLE',
// example: CREATE TABLE IF NOT EXISTS "payload_locked_documents" (
// "id" serial PRIMARY KEY NOT NULL,
// "global_slug" varchar,
// "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
// "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
// );

disableRowSecurity: 'DISABLE ROW LEVEL SECURITY;',
// example: ALTER TABLE "categories_rels" DISABLE ROW LEVEL SECURITY;

dropIndex: 'DROP INDEX IF EXISTS',
// example: DROP INDEX IF EXISTS "pages_title_idx";

setDefault: 'SET DEFAULT',
// example: ALTER TABLE "pages" ALTER COLUMN "_status" SET DEFAULT 'draft';

createIndex: 'INDEX IF NOT EXISTS',
// example: CREATE INDEX IF NOT EXISTS "payload_locked_documents_global_slug_idx" ON "payload_locked_documents" USING btree ("global_slug");

dropType: 'DROP TYPE',
// example: DROP TYPE "public"."enum__pages_v_published_locale";
}

const result = Object.keys(groups).reduce((result, group: Groups) => {
result[group] = []
return result
}, {}) as Record<Groups, string[]>

// push multi-line changes to a single grouping
let isCreateTable = false

for (const line of list) {
if (isCreateTable) {
result.createTable.push(line)
if (line.includes(');')) {
isCreateTable = false
}
continue
}
Object.entries(groups).some(([key, value]) => {
if (line.endsWith('NOT NULL;')) {
// split up the ADD COLUMN and ALTER COLUMN NOT NULL statements
Expand Down
154 changes: 106 additions & 48 deletions packages/drizzle/src/postgres/predefinedMigrations/v2-v3/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,17 @@ type Args = {
req?: Partial<PayloadRequest>
}

const runStatementGroup = async ({ adapter, db, debug, statements }) => {
const addColumnsStatement = statements.join('\n')

if (debug) {
adapter.payload.logger.info(debug)
adapter.payload.logger.info(addColumnsStatement)
}

await db.execute(sql.raw(addColumnsStatement))
}

/**
* Moves upload and relationship columns from the join table and into the tables while moving data
* This is done in the following order:
Expand Down Expand Up @@ -81,16 +92,57 @@ export const migratePostgresV2toV3 = async ({ debug, payload, req }: Args) => {

const sqlUpStatements = groupUpSQLStatements(generatedSQL)

const addColumnsStatement = sqlUpStatements.addColumn.join('\n')

if (debug) {
payload.logger.info('CREATING NEW RELATIONSHIP COLUMNS')
payload.logger.info(addColumnsStatement)
}

const db = await getTransaction(adapter, req)

await db.execute(sql.raw(addColumnsStatement))
await runStatementGroup({
adapter,
db,
debug: debug ? 'CREATING TYPES' : null,
statements: sqlUpStatements.createType,
})

await runStatementGroup({
adapter,
db,
debug: debug ? 'ALTERING TYPES' : null,
statements: sqlUpStatements.alterType,
})

await runStatementGroup({
adapter,
db,
debug: debug ? 'CREATING TABLES' : null,
statements: sqlUpStatements.createTable,
})

await runStatementGroup({
adapter,
db,
debug: debug ? 'DISABLING ROW LEVEL SECURITY' : null,
statements: sqlUpStatements.disableRowSecurity,
})

await runStatementGroup({
adapter,
db,
debug: debug ? 'CREATING NEW RELATIONSHIP COLUMNS' : null,
statements: sqlUpStatements.addColumn,
})

// SET DEFAULTS
await runStatementGroup({
adapter,
db,
debug: debug ? 'SETTING DEFAULTS' : null,
statements: sqlUpStatements.setDefault,
})

await runStatementGroup({
adapter,
db,
debug: debug ? 'CREATING INDEXES' : null,
statements: sqlUpStatements.createIndex,
})

for (const collection of payload.config.collections) {
const tableName = adapter.tableNameMap.get(toSnakeCase(collection.slug))
Expand Down Expand Up @@ -238,52 +290,58 @@ export const migratePostgresV2toV3 = async ({ debug, payload, req }: Args) => {
}

// ADD CONSTRAINT
const addConstraintsStatement = sqlUpStatements.addConstraint.join('\n')

if (debug) {
payload.logger.info('ADDING CONSTRAINTS')
payload.logger.info(addConstraintsStatement)
}

await db.execute(sql.raw(addConstraintsStatement))
await runStatementGroup({
adapter,
db,
debug: debug ? 'ADDING CONSTRAINTS' : null,
statements: sqlUpStatements.addConstraint,
})

// NOT NULL
const notNullStatements = sqlUpStatements.notNull.join('\n')

if (debug) {
payload.logger.info('NOT NULL CONSTRAINTS')
payload.logger.info(notNullStatements)
}

await db.execute(sql.raw(notNullStatements))
await runStatementGroup({
adapter,
db,
debug: debug ? 'NOT NULL CONSTRAINTS' : null,
statements: sqlUpStatements.notNull,
})

// DROP TABLE
const dropTablesStatement = sqlUpStatements.dropTable.join('\n')

if (debug) {
payload.logger.info('DROPPING TABLES')
payload.logger.info(dropTablesStatement)
}

await db.execute(sql.raw(dropTablesStatement))
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING TABLES' : null,
statements: sqlUpStatements.dropTable,
})

// DROP INDEX
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING INDEXES' : null,
statements: sqlUpStatements.dropIndex,
})

// DROP CONSTRAINT
const dropConstraintsStatement = sqlUpStatements.dropConstraint.join('\n')

if (debug) {
payload.logger.info('DROPPING CONSTRAINTS')
payload.logger.info(dropConstraintsStatement)
}

await db.execute(sql.raw(dropConstraintsStatement))
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING CONSTRAINTS' : null,
statements: sqlUpStatements.dropConstraint,
})

// DROP COLUMN
const dropColumnsStatement = sqlUpStatements.dropColumn.join('\n')

if (debug) {
payload.logger.info('DROPPING COLUMNS')
payload.logger.info(dropColumnsStatement)
}

await db.execute(sql.raw(dropColumnsStatement))
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING COLUMNS' : null,
statements: sqlUpStatements.dropColumn,
})

// DROP TYPES
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING TYPES' : null,
statements: sqlUpStatements.dropType,
})
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export const migrateRelationships = async ({
${where} ORDER BY parent_id LIMIT 500 OFFSET ${offset * 500};
`

paginationResult = await adapter.drizzle.execute(sql.raw(`${paginationStatement}`))
paginationResult = await db.execute(sql.raw(`${paginationStatement}`))

if (paginationResult.rows.length === 0) {
return
Expand All @@ -72,7 +72,7 @@ export const migrateRelationships = async ({
payload.logger.info(statement)
}

const result = await adapter.drizzle.execute(sql.raw(`${statement}`))
const result = await db.execute(sql.raw(`${statement}`))

const docsToResave: DocsToResave = {}

Expand Down
Loading