我正在努力正确利用Postgressqlx
的pq
驱动程序来在数据库中创建一行。让我们从简单的开始:
我有一个user
,role
和user_role
表。我想在数据库中插入一个角色并获取插入行的 ID。使用以下 sql 可以完美地工作:
const createRoleSQL = "INSERT INTO role (name) VALUES (:name) RETURNING id"
为了使这项工作顺利进行,我在某个时候准备了声明:
createStmt, err := db.PrepareNamed(createRoleSQL)
if err != nil {
// ...
}
创建时,我将查询作为事务的一部分运行tx
。role
显然是具有正确字段和db
标签的结构:
if err := tx.NamedStmt(createStmt).QueryRow(role).Scan(&role.ID); err != nil {
// ...
}
这工作得很好。
现在我想扩展它并插入一个新角色并将其分配给用户:
const createUserRoleSQL = `
DO $$
DECLARE role_id role.id%TYPE;
BEGIN
INSERT INTO role (name) VALUES ($2) RETURNING id INTO role_id;
INSERT INTO user_role (user_id, role_id) VALUES ($1, role_id);
END $$`
createStmt, err := db.Preparex(createUserRoleSQL)
if err != nil {
// ...
}
if err := tx.Stmtx(createStmt).QueryRow(userID, role.Name).Scan(&role.ID); err != nil {
// ...
}
不幸的是,这失败了sql: expected 0 arguments, got 2
。是否可以通过单个查询来实现我想要做的事情?