WIP: more prisma migrate
This commit is contained in:
parent
592309559d
commit
6a6597c657
39
package-lock.json
generated
39
package-lock.json
generated
|
@ -9,6 +9,7 @@
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@prisma/client": "^3.11.1",
|
||||||
"@tailwindcss/forms": "^0.4.0",
|
"@tailwindcss/forms": "^0.4.0",
|
||||||
"@tailwindcss/typography": "^0.5.1",
|
"@tailwindcss/typography": "^0.5.1",
|
||||||
"@types/jsdom": "^16.2.14",
|
"@types/jsdom": "^16.2.14",
|
||||||
|
@ -1194,12 +1195,37 @@
|
||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@prisma/client": {
|
||||||
|
"version": "3.11.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.11.1.tgz",
|
||||||
|
"integrity": "sha512-B3C7zQG4HbjJzUr2Zg9UVkBJutbqq9/uqkl1S138+keZCubJrwizx3RuIvGwI+s+pm3qbsyNqXiZgL3Ir0fSng==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@prisma/engines-version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12.6"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"prisma": "*"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"prisma": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@prisma/engines": {
|
"node_modules/@prisma/engines": {
|
||||||
"version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9",
|
"version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz",
|
||||||
"integrity": "sha512-MILbsGnvmnhCbFGa2/iSnsyGyazU3afzD7ldjCIeLIGKkNBMSZgA2IvpYsAXl+6qFHKGrS3B2otKfV31dwMSQw==",
|
"integrity": "sha512-MILbsGnvmnhCbFGa2/iSnsyGyazU3afzD7ldjCIeLIGKkNBMSZgA2IvpYsAXl+6qFHKGrS3B2otKfV31dwMSQw==",
|
||||||
"hasInstallScript": true
|
"hasInstallScript": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@prisma/engines-version": {
|
||||||
|
"version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9",
|
||||||
|
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz",
|
||||||
|
"integrity": "sha512-HkcsDniA4iNb/gi0iuyOJNAM7nD/LwQ0uJm15v360O5dee3TM4lWdSQiTYBMK6FF68ACUItmzSur7oYuUZ2zkQ=="
|
||||||
|
},
|
||||||
"node_modules/@rescript/react": {
|
"node_modules/@rescript/react": {
|
||||||
"version": "0.10.3",
|
"version": "0.10.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rescript%2freact/-/react-0.10.3.tgz",
|
"resolved": "https://registry.npmjs.org/@rescript%2freact/-/react-0.10.3.tgz",
|
||||||
|
@ -36242,11 +36268,24 @@
|
||||||
"fastq": "^1.6.0"
|
"fastq": "^1.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@prisma/client": {
|
||||||
|
"version": "3.11.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.11.1.tgz",
|
||||||
|
"integrity": "sha512-B3C7zQG4HbjJzUr2Zg9UVkBJutbqq9/uqkl1S138+keZCubJrwizx3RuIvGwI+s+pm3qbsyNqXiZgL3Ir0fSng==",
|
||||||
|
"requires": {
|
||||||
|
"@prisma/engines-version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@prisma/engines": {
|
"@prisma/engines": {
|
||||||
"version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9",
|
"version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz",
|
||||||
"integrity": "sha512-MILbsGnvmnhCbFGa2/iSnsyGyazU3afzD7ldjCIeLIGKkNBMSZgA2IvpYsAXl+6qFHKGrS3B2otKfV31dwMSQw=="
|
"integrity": "sha512-MILbsGnvmnhCbFGa2/iSnsyGyazU3afzD7ldjCIeLIGKkNBMSZgA2IvpYsAXl+6qFHKGrS3B2otKfV31dwMSQw=="
|
||||||
},
|
},
|
||||||
|
"@prisma/engines-version": {
|
||||||
|
"version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9",
|
||||||
|
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz",
|
||||||
|
"integrity": "sha512-HkcsDniA4iNb/gi0iuyOJNAM7nD/LwQ0uJm15v360O5dee3TM4lWdSQiTYBMK6FF68ACUItmzSur7oYuUZ2zkQ=="
|
||||||
|
},
|
||||||
"@rescript/react": {
|
"@rescript/react": {
|
||||||
"version": "0.10.3",
|
"version": "0.10.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rescript%2freact/-/react-0.10.3.tgz",
|
"resolved": "https://registry.npmjs.org/@rescript%2freact/-/react-0.10.3.tgz",
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
"dbshell": ". .env && psql $DIGITALOCEAN_POSTGRES"
|
"dbshell": ". .env && psql $DIGITALOCEAN_POSTGRES"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@prisma/client": "^3.11.1",
|
||||||
"@tailwindcss/forms": "^0.4.0",
|
"@tailwindcss/forms": "^0.4.0",
|
||||||
"@tailwindcss/typography": "^0.5.1",
|
"@tailwindcss/typography": "^0.5.1",
|
||||||
"@types/jsdom": "^16.2.14",
|
"@types/jsdom": "^16.2.14",
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
// This is your Prisma schema file,
|
|
||||||
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
||||||
|
|
||||||
generator client {
|
generator client {
|
||||||
provider = "prisma-client-js"
|
provider = "prisma-client-js"
|
||||||
}
|
}
|
||||||
|
@ -9,3 +6,48 @@ datasource db {
|
||||||
provider = "postgresql"
|
provider = "postgresql"
|
||||||
url = env("DIGITALOCEAN_POSTGRES")
|
url = env("DIGITALOCEAN_POSTGRES")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
model dashboards {
|
||||||
|
id String @id
|
||||||
|
title String
|
||||||
|
description String
|
||||||
|
contents Json
|
||||||
|
timestamp DateTime @db.Timestamp(6)
|
||||||
|
creator String
|
||||||
|
extra Json
|
||||||
|
}
|
||||||
|
|
||||||
|
model frontpage {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
frontpage_full Json
|
||||||
|
frontpage_sliced Json
|
||||||
|
}
|
||||||
|
|
||||||
|
model history {
|
||||||
|
id String
|
||||||
|
title String
|
||||||
|
url String
|
||||||
|
platform String
|
||||||
|
description String
|
||||||
|
options Json
|
||||||
|
timestamp DateTime @db.Timestamp(6)
|
||||||
|
stars Int
|
||||||
|
qualityindicators Json
|
||||||
|
extra Json
|
||||||
|
pk Int @id @default(autoincrement())
|
||||||
|
|
||||||
|
@@index([id])
|
||||||
|
}
|
||||||
|
|
||||||
|
model questions {
|
||||||
|
id String @id
|
||||||
|
title String
|
||||||
|
url String
|
||||||
|
platform String
|
||||||
|
description String
|
||||||
|
options Json
|
||||||
|
timestamp DateTime @db.Timestamp(6)
|
||||||
|
stars Int
|
||||||
|
qualityindicators Json
|
||||||
|
extra Json
|
||||||
|
}
|
||||||
|
|
92
src/backend/migrate/prepareForPrisma.ts
Normal file
92
src/backend/migrate/prepareForPrisma.ts
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
import "dotenv/config";
|
||||||
|
|
||||||
|
import { readWritePool } from "../database/pg-wrapper";
|
||||||
|
|
||||||
|
const migrate = async () => {
|
||||||
|
const client = await readWritePool.connect();
|
||||||
|
|
||||||
|
const execQuery = async (q: string) => {
|
||||||
|
console.log(q);
|
||||||
|
await client.query(q);
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
await client.query("BEGIN");
|
||||||
|
|
||||||
|
const notNullColumn = async (table: string, column: string) => {
|
||||||
|
await execQuery(
|
||||||
|
`ALTER TABLE ${table} ALTER COLUMN ${column} SET NOT NULL`
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const jsonbColumn = async (table: string, column: string) => {
|
||||||
|
await execQuery(
|
||||||
|
`ALTER TABLE ${table} ALTER COLUMN ${column} SET DATA TYPE jsonb USING ${column}::jsonb`
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const t2c = {
|
||||||
|
dashboards: [
|
||||||
|
"id",
|
||||||
|
"title",
|
||||||
|
"description",
|
||||||
|
"contents",
|
||||||
|
"timestamp",
|
||||||
|
"creator",
|
||||||
|
"extra",
|
||||||
|
],
|
||||||
|
frontpage: ["frontpage_sliced", "frontpage_full"],
|
||||||
|
history: [
|
||||||
|
"id",
|
||||||
|
"title",
|
||||||
|
"url",
|
||||||
|
"platform",
|
||||||
|
"description",
|
||||||
|
"options",
|
||||||
|
"timestamp",
|
||||||
|
"stars",
|
||||||
|
"qualityindicators",
|
||||||
|
"extra",
|
||||||
|
],
|
||||||
|
questions: [
|
||||||
|
"id",
|
||||||
|
"title",
|
||||||
|
"url",
|
||||||
|
"platform",
|
||||||
|
"description",
|
||||||
|
"options",
|
||||||
|
"timestamp",
|
||||||
|
"stars",
|
||||||
|
"qualityindicators",
|
||||||
|
"extra",
|
||||||
|
],
|
||||||
|
};
|
||||||
|
for (const [table, columns] of Object.entries(t2c)) {
|
||||||
|
for (const column of columns) {
|
||||||
|
await notNullColumn(table, column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await execQuery("ALTER TABLE history ADD COLUMN pk SERIAL PRIMARY KEY");
|
||||||
|
await execQuery("ALTER TABLE dashboards ADD PRIMARY KEY (id)");
|
||||||
|
await execQuery("ALTER TABLE questions ADD PRIMARY KEY (id)");
|
||||||
|
|
||||||
|
await jsonbColumn("dashboards", "contents");
|
||||||
|
await jsonbColumn("dashboards", "extra");
|
||||||
|
|
||||||
|
for (const table of ["history", "questions"]) {
|
||||||
|
await jsonbColumn(table, "options");
|
||||||
|
await jsonbColumn(table, "qualityindicators");
|
||||||
|
await jsonbColumn(table, "extra");
|
||||||
|
}
|
||||||
|
|
||||||
|
await client.query("COMMIT");
|
||||||
|
} catch (e) {
|
||||||
|
await client.query("ROLLBACK");
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
client.release();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
migrate();
|
Loading…
Reference in New Issue
Block a user