Go:SQLite 中存储的信息错误

问题描述 投票:0回答:1

我正在构建一个 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 高于现有板 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 更新父级,问题仍然存在:
我是一个不知道如何查询的白痴还是这以某种方式颠倒了?因为除非发生一些奇怪的曼德拉效应,否则我可以发誓更新查询是正确的。

sql sqlite go sql-update
1个回答
0
投票

所以这是一个语法问题,我应该使用

$
作为参数,而不是使用
?
,所以如果而不是:

UPDATE cards
    SET board_id = $2
    WHERE id = $1
    RETURNING *;

我有:

UPDATE cards
    SET board_id = ?2
    WHERE id = ?1
    RETURNING *;

它有效。

我想我毕竟不知道如何查询。

© www.soinside.com 2019 - 2024. All rights reserved.