Есть ли способ реструктурировать мою таблицу createTable в node-postgresql?

У меня есть схема postgres для моего проекта node-postgres, у меня есть только две таблицы без созданного внешнего ключа (таблицы встреч и пользователей). Как я могу написать свой код, чтобы каждая таблица создавалась со своими внешними ключами? Это то, что я сделал ниже, как я могу всегда использовать ожидание при создании таблицы. Заранее спасибо!

import { Pool } from 'pg';
import dotenv from 'dotenv';

dotenv.config();

const pool = new Pool({
    connectionString: process.env.DATABASE_URL
});

pool.on('connect', () => {
    console.info('connected to the db');
});

/**
 * create Database Tables
 */
const createTables = () => {
    const meetupTable = `CREATE TABLE IF NOT EXISTS
        meetups(
            id UUID PRIMARY KEY,
            topic VARCHAR(128) NOT NULL,
            location VARCHAR(128) NOT NULL,
            body TEXT NOT NULL,
            happeningOn TIMESTAMPTZ NOT NULL,
            Tags TEXT[] NOT NULL,
            meetupImage bytea,
            createdOn TIMESTAMPTZ DEFAULT Now()
        )``;
    pool.query(meetupTable)
        .catch((err) => {
            console.info(err);
            pool.end();
        });

    const questionTable = `CREATE TABLE IF NOT EXISTS
        questions(
            id UUID PRIMARY KEY,
            title VARCHAR(128) UNIQUE NOT NULL,
            votes INT REFERENCES votes(no_votes) ON DELETE RESTRICT,
            body TEXT NOT NULL,
            createdOn TIMESTAMPTZ
        )`;
    pool.query(questionTable)
        .catch((err) => {
            console.info(err);
            pool.end();
        });

    const rsvpTable = `CREATE TABLE IF NOT EXISTS 
    rsvps(
        id UUID PRIMARY KEY,
        meetupId UUID UNIQUE REFERENCES meetups(id) ON DELETE RESTRICT,
        userId UUID UNIQUE REFERENCES users(id) ON DELETE RESTRICT
        response VARCHAR(128) NOT NULL,
        date TIMESTAMPTZ DEFAULT Now()
        )`;
    pool.query(rsvpTable)
        .catch((err) => {
            console.info(err);
            pool.end();
        });

    const userTable = `CREATE TABLE IF NOT EXISTS 
        users(
            id UUID PRIMARY KEY,
            userImage bytea,
            firstName VARCHAR(128) NOT NULL,
            lastName VARCHAR(128) NOT NULL,
            otherName VARCHAR(128) NOT NULL,
            email VARCHAR(128) UNIQUE NOT NULL,
            password VARCHAR(128) NOT NULL,
            userName VARCHAR(128) NOT NULL,
            phoneNumber VARCHAR(128) NOT NULL,
            isAdmin VARCHAR(128) NOT NULL,
            createdOn TIMESTAMPTZ DEFAULT Now()
        )`;
    pool.query(userTable)
        .catch((err) => {
            console.info(err);
            pool.end();
        });

    const votes = `CREATE TABLE IF NOT EXISTS 
        votes(
            id UUID PRIMARY KEY,
            questionId UUID REFERENCES questions(id) ON DELETE RESTRICT,
            userId UUID UNIQUE REFERENCES users(id) ON DELETE RESTRICT,
            no_votes INT PRIMARY KEY,
            createdOn TIMESTAMPTZ
        )`;
    pool.query(votes)
        .catch((err) => {
            console.info(err);
            pool.end();
        });

};

pool.on('remove', () => {
    console.info('client removed');
    process.exit(0);
});


module.exports = {
    createTables
};

require('make-runnable');

Создайте таблицу и после этого измените схему, добавив внешние ключи. Кстати: вы думали о написании кода, независимого от механизма базы данных? Knex хорошая библиотека. и у него есть инструмент миграции: knexjs.org/#Миграции

bato3 25.03.2019 22:19

Да, я только учусь, я использую sql-запрос для лучшего понимания, но я буду использовать sequenceize или knex. Большое спасибо

Kaztech 27.03.2019 21:37

Он работает, сначала создавая таблицу и изменяя таблицу, чтобы добавить внешние ключи.

Kaztech 27.03.2019 21:38
ЭТО НЕ РАБОТАЛОconst alterQuestion1 = ALTER TABLE questions ADD CONSTRAINT fk_questions_votes FOREIGN KEY (votes) REFERENCES votes (no_votes); pool.query(alterQuestion1) .catch((err) => { console.info(err); pool.end(); });
Kaztech 27.03.2019 21:39
sequelize это ORM поверх knex (построитель запросов, также позволяет выполнять необработанные запросы) Извините, я недостаточно знаю PostgreSQL, чтобы помочь вам. Тем более без сообщения об ошибке. С этим запросом, который смотрит на MySQL. Хороший способ учиться — анализировать магию. Напишите миграцию knex, но перед ее запуском запустите: set DEBUG=knex:* чтобы вывести все сгенерированные запросы.
bato3 28.03.2019 13:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
118
0

Другие вопросы по теме