我正在构建一个 Trello 克隆,我有这个结构,它是一张卡片,它进入看板,如果您熟悉看板,您就知道它是什么。
type Card struct {
Id int64
Title string
Description string
CheckList dll.DLL
CardLabels dll.DLL
}
现在要将此卡从一个板移动到另一个板,它首先存储对初始板的引用,当选择目标板时,它会运行此功能:
func (p *Project) moveCard() {
boardFrom, err := p.project.Boards.GetAt(p.moveFrom[0])
if err != nil {
logger.Error.Fatal(err)
return
}
boardTo := p.getBoard()
c, err := boardFrom.(*kanban.Board).Cards.GetAt(p.moveFrom[1])
if err != nil {
logger.Error.Fatal(err)
return
}
cardVal := *c.(*kanban.Card)
storage.UpdateCardParent(cardVal.Id, boardTo.Id)
boardFrom.(*kanban.Board).Cards.RemoveAt(p.moveFrom[1])
boardTo.Cards.Append(&cardVal)
p.setLists()
}
在前端,一切都很好,卡按预期从一个板移动到另一块板,但是保存到数据库
storage.UpdateCardParent(cardVal.Id, boardTo.Id)
在保存新板ID时显示出不稳定的行为,因此在下一次加载时,它会加载卡在不规则存储的板上。自从我确认问题是将值存储到数据库中以来,我要么得到的值错误,要么查询错误,但我看不到任何错误。我已确认已使用正确的父 ID 创建了板并创建了卡片,这只在移动时才会发生。 更新时执行的架构和查询:
CREATE TABLE IF NOT EXISTS boards (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS cards (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
card_desc TEXT,
board_id INTEGER NOT NULL REFERENCES boards(id) ON DELETE CASCADE
);
UPDATE cards
SET board_id = $2
WHERE id = $1
RETURNING *;
以及执行所述查询的函数:
func UpdateCardParent(id int64, boardId int64) sql.Result {
stmt, err := DB.Prepare(UpdateCardParentSql)
if err != nil {
logger.Error.Fatal(ErrCreatSQLstmt, err)
}
res, err := stmt.Exec(id, boardId)
if err != nil {
logger.Error.Fatal(ErrExecSQLstmt, err)
}
return res
}
我在这里没有看到任何问题,日志显示传递给 SQL 执行的正确值,我只是盲目的还是完全看错了地方?
如果您想尝试找到错误中的模式,这是存储库: https://github.com/Anacardo89/kanboards
更新:
好的,经过进一步检查,我意识到它正在反向获取查询输入,因此它实际上是使用带有 board_id 的卡并使用 card_id 更新父级,问题仍然存在:
我是一个不知道如何查询的白痴还是这以某种方式颠倒了?因为除非发生一些奇怪的曼德拉效应,否则我可以发誓更新查询是正确的。
所以这是一个语法问题,我应该使用
$
作为参数,而不是使用 ?
,所以如果而不是:
UPDATE cards
SET board_id = $2
WHERE id = $1
RETURNING *;
我有:
UPDATE cards
SET board_id = ?2
WHERE id = ?1
RETURNING *;
它有效。
我想我毕竟不知道如何查询。