Postgresql:如何使用 where 子句编写插入查询
Postgresql: How to write insert query using where clause
假设我们有一个名为 user
的 table,它有 userId
列。
user
----
userId
我们有另一个 table 叫做 Team
,它有 2 列 userId
和 leadId
。
Team
----
userId
leadId
条件一:
我想将数据插入 Teams table 并且该值应该在用户 table 中。换句话说 userId
和 leadId
of Teams
table 应该 userId
of user
table。否则它会抛出用户 table.
中不存在 id 的错误
条件二:
还有一个条件是 userId
和 leadId
不能相同。这是通过使用 if check.
完成的
这是我的 API 代码
router.post('/', checkToken, async (req, res) => {
try {
const { body } = req;
const {
userId,
leadId
} = body
const dataToInsert = {
userId,
leadId
}
if (userId == leadId) {
res.status(300).json({ error: "Lead id and user can't be same." })
}
else {
const data = await db.Team.create(dataToInsert)
res.status(200).json({
data
})
}
} catch (e) {
console.log("Error in inserting team lead", e)
res.status(500).json({
error: "Internal Server Error",
status: false,
})
}
})
export default router;
请帮助如何处理条件 1。
更新:
这就是我现在尝试的
const IdCount= await db.User.findAll({
attributes: [[db.Sequelize.fn('count', db.Sequelize.col('id')), 'getIdCount']],
where: { "id": userId && leadId }
});
IdCount 的输出:
这是输出,getIdCount 值为 0,这是正确的,但它向我发送了整个对象,我如何才能只获得 getIdCount 值?
[
user {
dataValues: { getIdCount: '0' },
_previousDataValues: { getIdCount: '0' },
_changed: Set(0) {},
_options: {
isNewRecord: false,
_schema: null,
_schemaDelimiter: '',
raw: true,
attributes: [Array]
},
isNewRecord: false
}
]
你只需要确保这两个用户都存在于Users table中(对Users table执行两次查询)然后插入一条记录到Teams
table.
最好使用显式事务来获取两个用户并将记录插入 Teams。
要获得您在数据库中有一个用户,您可以使用 count
:
const whereClause = userId ? {
where: {
id: userId,
}
} : {}
const userCount = await db.User.count({
where: {
id: userId
}
})
const userExists = count === 1;
你可以用同样的方法检查leadId
这是我所做的,它在所有条件下都给我正确的响应
router.post('/admin/assign', checkToken, authorize('admin'), async (req, res) => {
try {
const { body } = req;
const {
userId,
leadId
} = body
const dataToInsert = {
userId,
leadId
}
const idCount = await db.User.count({ where: { [Op.or]: [{ id: userId }, { id: leadId }] } })
if (userId == leadId) {
res.status(400).json({ error: "Lead id and user can't be same." })
}
else if (idCount == 2) {
const data = await db.Team.create(dataToInsert)
res.status(200).json({
data
})
}
else {
res.status(400).json({ error: "UserId or LeadId doesn't exist" })
}
} catch (e) {
console.log("Error in inserting team lead", e)
res.status(500).json({
error: "Internal Server Error",
status: false,
})
}
})
export default router;
假设我们有一个名为 user
的 table,它有 userId
列。
user
----
userId
我们有另一个 table 叫做 Team
,它有 2 列 userId
和 leadId
。
Team
----
userId
leadId
条件一:
我想将数据插入 Teams table 并且该值应该在用户 table 中。换句话说 userId
和 leadId
of Teams
table 应该 userId
of user
table。否则它会抛出用户 table.
条件二:
还有一个条件是 userId
和 leadId
不能相同。这是通过使用 if check.
这是我的 API 代码
router.post('/', checkToken, async (req, res) => {
try {
const { body } = req;
const {
userId,
leadId
} = body
const dataToInsert = {
userId,
leadId
}
if (userId == leadId) {
res.status(300).json({ error: "Lead id and user can't be same." })
}
else {
const data = await db.Team.create(dataToInsert)
res.status(200).json({
data
})
}
} catch (e) {
console.log("Error in inserting team lead", e)
res.status(500).json({
error: "Internal Server Error",
status: false,
})
}
})
export default router;
请帮助如何处理条件 1。
更新: 这就是我现在尝试的
const IdCount= await db.User.findAll({
attributes: [[db.Sequelize.fn('count', db.Sequelize.col('id')), 'getIdCount']],
where: { "id": userId && leadId }
});
IdCount 的输出:
这是输出,getIdCount 值为 0,这是正确的,但它向我发送了整个对象,我如何才能只获得 getIdCount 值?
[
user {
dataValues: { getIdCount: '0' },
_previousDataValues: { getIdCount: '0' },
_changed: Set(0) {},
_options: {
isNewRecord: false,
_schema: null,
_schemaDelimiter: '',
raw: true,
attributes: [Array]
},
isNewRecord: false
}
]
你只需要确保这两个用户都存在于Users table中(对Users table执行两次查询)然后插入一条记录到Teams
table.
最好使用显式事务来获取两个用户并将记录插入 Teams。
要获得您在数据库中有一个用户,您可以使用 count
:
const whereClause = userId ? {
where: {
id: userId,
}
} : {}
const userCount = await db.User.count({
where: {
id: userId
}
})
const userExists = count === 1;
你可以用同样的方法检查leadId
这是我所做的,它在所有条件下都给我正确的响应
router.post('/admin/assign', checkToken, authorize('admin'), async (req, res) => {
try {
const { body } = req;
const {
userId,
leadId
} = body
const dataToInsert = {
userId,
leadId
}
const idCount = await db.User.count({ where: { [Op.or]: [{ id: userId }, { id: leadId }] } })
if (userId == leadId) {
res.status(400).json({ error: "Lead id and user can't be same." })
}
else if (idCount == 2) {
const data = await db.Team.create(dataToInsert)
res.status(200).json({
data
})
}
else {
res.status(400).json({ error: "UserId or LeadId doesn't exist" })
}
} catch (e) {
console.log("Error in inserting team lead", e)
res.status(500).json({
error: "Internal Server Error",
status: false,
})
}
})
export default router;