From 0f993cffe304217886b7af49081a7c926240781b Mon Sep 17 00:00:00 2001 From: Pacharapol Withayasakpunt Date: Tue, 19 Oct 2021 13:57:38 +0700 Subject: [PATCH] add constraint --- scripts/edict.ts | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/scripts/edict.ts b/scripts/edict.ts index b659e1e..175bf1e 100644 --- a/scripts/edict.ts +++ b/scripts/edict.ts @@ -1,8 +1,9 @@ import createConnectionPool, { ConnectionPool, sql } from '@databases/pg' import sqlite3 from 'better-sqlite3' +import S from 'jsonschema-definer' import { PythonShell } from 'python-shell' -async function main(db: ConnectionPool) { +export async function main(db: ConnectionPool) { const s3 = sqlite3('./assets/edict.db') const rows = s3 @@ -67,14 +68,18 @@ async function main(db: ConnectionPool) { await db.query(sql` INSERT INTO "entry" ("userId", "type", "entry", "key", "reading", "translation") VALUES ${sql.join( - sublot.map( - (r) => - sql`(uuid_nil(), 'vocabulary', ${JSON.parse( - r.entry - )}, ${`edict:${r.id}`}, ${{ - _: JSON.parse(r.reading), - }}, ${{ en: JSON.parse(r.english) }})` - ), + sublot.map((r) => { + const reading = JSON.parse(r.reading) + const english = JSON.parse(r.english) + + return sql`(uuid_nil(), 'vocabulary', ${JSON.parse( + r.entry + )}, ${`edict:${r.id}`}, ${{ + _: reading.length ? reading : undefined, + }}, ${{ + en: english.length ? english : undefined, + }})` + }), ',' )} ON CONFLICT DO NOTHING; @@ -82,6 +87,22 @@ async function main(db: ConnectionPool) { } } -if (require.main === module) { - main(createConnectionPool({ bigIntMode: 'number' })) +export async function constraint(db: ConnectionPool) { + const sReading = S.object().additionalProperties( + S.list(S.string()).minItems(1) + ) + + const colName = sql`translation` + const constraintName = sql`c_entry_${colName}` + + await db.query(sql` + ALTER TABLE "entry" DROP CONSTRAINT IF EXISTS ${constraintName}; + ALTER TABLE "entry" ADD CONSTRAINT ${constraintName} CHECK (validate_json_schema('${sql.__dangerous__rawValue( + JSON.stringify(sReading.valueOf()) + )}', ${colName})) + `) +} + +if (require.main === module) { + constraint(createConnectionPool({ bigIntMode: 'number' })) }