Javascript 创建具有节点pg引发外键冲突错误的多个从属插入
一点背景- 我有3个表-列表、类别和图像表 这些表是使用下面定义的普通老sql构建的 列表Javascript 创建具有节点pg引发外键冲突错误的多个从属插入,javascript,node.js,typescript,postgresql,node-pg-pool,Javascript,Node.js,Typescript,Postgresql,Node Pg Pool,一点背景- 我有3个表-列表、类别和图像表 这些表是使用下面定义的普通老sql构建的 列表 create table if not exists listing ( id serial not null, title varchar(200) not null, slug varchar(300) unique not null, price
create table if not exists listing
(
id serial not null,
title varchar(200) not null,
slug varchar(300) unique not null,
price integer not null,
currency_name varchar(10) not null default 'EUR',
currency_symbol varchar(5) default '€',
img_url varchar(300),
rating integer,
description varchar(3600) not null,
key_features varchar(300) not null,
vendor_id integer not null,
listing_status LISTING_STATUS default 'pending',
created_at timestamptz default now(),
updated_at timestamptz default now(),
CONSTRAINT valid_price check ( price >= 0)
);
alter table listing
owner to "izzy",
add constraint listing_pk primary key (id),
add constraint listing_user_fk foreign key (vendor_id) references "user" (id);
图像表
create table if not exists image
(
id serial not null,
listing_id integer not null,
img_url text not null,
thumbnail_img_url text not null,
created_at timestamptz default now()
);
alter table image
owner to "izzy",
add constraint image_id_pk primary key (id),
add constraint image_listing_fk foreign key (listing_id) references listing (id);
类别表
create table if not exists category
(
id serial not null,
category_id integer not null,
name varchar(100) not null,
suggested_name varchar(100) not null,
link varchar(100) not null,
rel_link varchar(100) not null,
listing_id integer not null,
created_at timestamptz default now(),
updated_at timestamptz default now()
);
alter table category
owner to "izzy",
add constraint category_id_pk primary key (id),
add constraint category_listing_fk foreign key (listing_id) references listing (id);
下面是处理插入的函数
static async createListingForUser(body: any) {
const {
title, price, imgUrl, images, description, vendorId, slug, keyFeatures, categorys} = body;
logger.info(`inserting a new listing for user ${vendorId} with slug ${slug}`);
try {
await DBClient.client.query('BEGIN')
const createListingRes = await DBClient.client.query(this.CREATE_LISTING_QUERY, [title, price, imgUrl, description, vendorId, slug, keyFeatures]);
const {id} = createListingRes.rows[0];
const imageValues = images.map((i) => [id, i.original, i.original]);
const categoryvalues = categorys.map((c) => [c.id, c.name, c.suggestedName, c.link, c.relLink, id]);
let inserts = [];
if (categoryvalues && categoryvalues.length > 0) {
console.log(this.INSERT_CATEGORIES(categoryvalues));
inserts.push(DBClient.client.query(this.INSERT_CATEGORIES(categoryvalues)));
}
if (imageValues && imageValues.length > 0) {
console.log(this.INSERT_IMAGES(imageValues));
inserts.push(DBClient.client.query(this.INSERT_IMAGES(imageValues)));
}
await Promise.all(inserts);
await DBClient.client.query('COMMIT');
logger.info(`inserted listing with id ${id} to db`);
} catch (e) {
await DBClient.client.query('ROLLBACK')
logger.error(`rolling back transaction for vendor ${vendorId} with slug - ${slug}`, e);
throw e;
}
}
插入后出现的错误是
表“image”上的插入或更新违反外键约束
“图像\u列表\u fk”
我只是想澄清一下我用于this.CREATE\u LISTING\u QUERY的插入内容
insert into listing (title, price, img_url, description, vendor_id, slug, key_features)
values ($1, $2, $3, $4, $5, $6, $7)
returning id;`
insert\u类别的插入是
insert into category (category_id, name, suggested_name, link, rel_link, listing_id) values ('0', 'Animation', 'Animation', '/listing/categories/animation', 'animation', '24')
insert into image (listing_id, img_url, thumbnail_img_url) values ('24', 'url-to-add', 'url-to-add')
insert\u图像的插入是
insert into category (category_id, name, suggested_name, link, rel_link, listing_id) values ('0', 'Animation', 'Animation', '/listing/categories/animation', 'animation', '24')
insert into image (listing_id, img_url, thumbnail_img_url) values ('24', 'url-to-add', 'url-to-add')
我花了一整天的时间试图弄明白这一点,但除非我注释掉图像部分的插入代码,否则无法让它工作