У меня есть схема 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');
Да, я только учусь, я использую sql-запрос для лучшего понимания, но я буду использовать sequenceize или knex. Большое спасибо
Он работает, сначала создавая таблицу и изменяя таблицу, чтобы добавить внешние ключи.
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(); });sequelize это ORM поверх knex (построитель запросов, также позволяет выполнять необработанные запросы) Извините, я недостаточно знаю PostgreSQL, чтобы помочь вам. Тем более без сообщения об ошибке. С этим запросом, который смотрит на MySQL. Хороший способ учиться — анализировать магию. Напишите миграцию knex, но перед ее запуском запустите: set DEBUG=knex:* чтобы вывести все сгенерированные запросы.





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