如何修复多行 node-postgres 插入 - 语法错误等于或接近 $4
How to fix multi row node-postgres insert - Syntax Error at or near $4
我有一个多行 node-postgres 插入,它给我带来了问题。它是一个参数化查询,使用通用 Table 表达式更新主 table 和两个带有外键的 table。该查询使用主 table 的参数,但是,当我尝试参数化多行的外键 table 时,它会抛出语法错误。
首先,我有一个接受数组和 returns 一串值的函数。
const buildValues = (id, values) => {
return values
.map(val => "(" + id + ", '" + val + "', " + false + ")")
.join(", ");
};
这是我的查询:
app.post('/api/saveperson', function (req, res) {
pg.connect(connectionString, (err, client, done) => {
const insertPerson = `
WITH x AS ( INSERT INTO people (title, notes, name)
VALUES (, , )
RETURNING personId
),
b AS (
INSERT INTO sports (personid, name, favorite)
VALUES )
INSERT INTO instructions (personid, name, favorite)
VALUES ;
`;
client.query(insertPerson,
[ req.body.title
, req.body.notes
, req.body.name
, queries.buildValues("SELECT personId FROM x", req.body.sports)
, queries.buildValues("SELECT personId FROM x", req.body.instructions)
]
)
.then( () => client.end())
.catch( err => console.log(err));
});
return res.json(req.body);
});
不确定这是否是最佳解决方案,但我最终使用了 pg-promise library instead of just pg。然后我使用事务和链式查询:
db.tx(t => {
// BEGIN has been executed
return t.one(
`INSERT INTO people (title, notes, name)
VALUES ($[title], $[notes], $[name])
RETURNING personid`, req.body)
.then(data => {
let sportsQueries = req.body.sports.map(sport => {
return t.none(`INSERT INTO sports (personid, name)
VALUES (, )`, [data.personid, sport]);
});
let instructionsQueries = req.body.instructions.map(ins => {
return t.none(`INSERT INTO instructions (personid, instruction)
VALUES (, )`, [data.personid, ins]);
});
return t.batch(sportsQueries.concat(instructionsQueries));
});
})
.then(data => {
// Success, and COMMIT has been executed
})
.catch(error => {
// Failure, and ROLLBACK has been executed
})
我有一个多行 node-postgres 插入,它给我带来了问题。它是一个参数化查询,使用通用 Table 表达式更新主 table 和两个带有外键的 table。该查询使用主 table 的参数,但是,当我尝试参数化多行的外键 table 时,它会抛出语法错误。
首先,我有一个接受数组和 returns 一串值的函数。
const buildValues = (id, values) => {
return values
.map(val => "(" + id + ", '" + val + "', " + false + ")")
.join(", ");
};
这是我的查询:
app.post('/api/saveperson', function (req, res) {
pg.connect(connectionString, (err, client, done) => {
const insertPerson = `
WITH x AS ( INSERT INTO people (title, notes, name)
VALUES (, , )
RETURNING personId
),
b AS (
INSERT INTO sports (personid, name, favorite)
VALUES )
INSERT INTO instructions (personid, name, favorite)
VALUES ;
`;
client.query(insertPerson,
[ req.body.title
, req.body.notes
, req.body.name
, queries.buildValues("SELECT personId FROM x", req.body.sports)
, queries.buildValues("SELECT personId FROM x", req.body.instructions)
]
)
.then( () => client.end())
.catch( err => console.log(err));
});
return res.json(req.body);
});
不确定这是否是最佳解决方案,但我最终使用了 pg-promise library instead of just pg。然后我使用事务和链式查询:
db.tx(t => {
// BEGIN has been executed
return t.one(
`INSERT INTO people (title, notes, name)
VALUES ($[title], $[notes], $[name])
RETURNING personid`, req.body)
.then(data => {
let sportsQueries = req.body.sports.map(sport => {
return t.none(`INSERT INTO sports (personid, name)
VALUES (, )`, [data.personid, sport]);
});
let instructionsQueries = req.body.instructions.map(ins => {
return t.none(`INSERT INTO instructions (personid, instruction)
VALUES (, )`, [data.personid, ins]);
});
return t.batch(sportsQueries.concat(instructionsQueries));
});
})
.then(data => {
// Success, and COMMIT has been executed
})
.catch(error => {
// Failure, and ROLLBACK has been executed
})