node.js - 如何在多对多关系Postgres中取回一行匹配
问题描述
id
鉴于 users和 pets ,我正在尝试取回用户的宠物id
。
我的表格如下
CREATE TABLE pet_owner (
id serial PRIMARY KEY,
first_name varchar(100) NOT NULL,
last_name varchar(100) NOT NULL,
phone_number varchar(50) UNIQUE,
address varchar(255) UNIQUE
);
CREATE TABLE pet (
id serial PRIMARY KEY,
first_name varchar(100) NOT NULL,
last_name varchar(100) NOT NULL,
breed varchar(100) NOT NULL,
weight numeric(5, 2),
date_of_birth date,
date_of_death date,
address varchar(255) NOT NULL
);
CREATE TABLE pet_petowner (
owner_id int REFERENCES pet_owner,
pet_id int REFERENCES pet,
PRIMARY KEY (owner_id, pet_id)
);
我的查询如下...
SELECT pet.id as id, pet.first_name as first_name, pet.last_name as last_name
FROM pet_petowner owner_pet
JOIN pet pet on (owner_pet.pet_id = 1)
WHERE owner_pet.owner_id = 1;
问题是即使具有指定的用户id
不拥有该宠物,它似乎也得到了该宠物。如果是这种情况,我相信我不想返回任何东西。
我实际上是在我的快速应用程序中执行此查询,如下所示...
exports.getPet = async (req, res) => {
const query = `SELECT pet.id as id, pet.first_name as first_name, pet.last_name as last_name
FROM pet_petowner owner_pet JOIN pet pet on (owner_pet.pet_id = ${req.params.pet_id})
WHERE owner_pet.owner_id = ${req.params.owner_id}`;
const { rows } = await pool.query(query);
res.status(200).send(rows[0]);
};
但显然,我有同样的问题。任何帮助,将不胜感激!
解决方案
查询需要指明如何连接两个表:
SELECT pet.id as id, pet.first_name as first_name, pet.last_name as last_name
FROM pet_petowner owner_pet
JOIN pet pet on (owner_pet.pet_id = pet.id)
WHERE owner_pet.owner_id = 1 AND pet.id = 1;
要在 node.js 中安全地使用查询,您必须转义参数或将它们作为占位符传递。https://www.atdatabases.org使用sql
标签自动执行此操作,因此看起来像:
exports.getPet = async (req, res) => {
const query = sql`
SELECT pet.id as id, pet.first_name as first_name, pet.last_name as last_name
FROM pet_petowner owner_pet
JOIN pet pet on (owner_pet.pet_id = pet.id)
WHERE owner_pet.owner_id = ${req.params.owner_id}
AND pet.id = ${req.params.pet_id}
`;
const rows = await pool.query(query);
res.status(200).send(rows[0]);
};
要做到这一点,您当前使用的库将执行以下操作:
exports.getPet = async (req, res) => {
const query = `
SELECT pet.id as id, pet.first_name as first_name, pet.last_name as last_name
FROM pet_petowner owner_pet
JOIN pet pet on (owner_pet.pet_id = pet.id)
WHERE owner_pet.owner_id = $1
AND pet.id = $2
`;
const rows = await pool.query(query, [
req.params.owner_id,
req.params.pet_id,
]);
res.status(200).send(rows[0]);
};
推荐阅读
- swift - 如何从 SwiftUI 中的函数返回枚举?
- c# - 模式弹出窗口未显示 runat=server on
- flask - 在烧瓶中创建数据库时如何在烧瓶-sqlalchemy中自动插入一行
- xcode - 在导航中转换到根标签栏控制器 XCODE
- php - 如何将 PHP 生成的 PNG 图像插入到我的 html 中?
- dataframe - 如何使用一个 np.where 语句更新数据框 A 的 3 列和数据框 B 的 3 列
- mysql - MySQL:第一次查询慢得多,但之后即使插入新数据也更快
- docker - spark在pod上运行时如何利用kubernetes的节点?
- python - 使用 Selenium 在网页上查找“登录”按钮
- apache-spark - pyspark 使用用户指定的模式读取 csv - 返回所有 StringType