4 回答
TA贡献1773条经验 获得超3个赞
:memory:
将为每个连接打开一个单独的数据库。改用file::memory:?cache=shared
。
更新:我在使用上面的代码时也遇到了一些锁定问题,在我看来,在测试中使用:memory:
with是一个更好的解决方案。db.DB().SetMaxOpenConns(1)
TA贡献1875条经验 获得超5个赞
也许这会帮助某人
我对“没有这样的表”有同样的问题,并找到了一个确切的解释:
如果 sql.Rows 在下一个查询之前没有关闭,那么驱动程序在下一个查询时不会返回这样的表。问题仅存在于内存存储中,文件支持的数据库的相同测试运行良好。
在那之后,我找到了我忘记做的代码部分rows.Close()
,修复了它,现在它可以正常工作了。
TA贡献1780条经验 获得超3个赞
如果您使用与在此处发布的表相同的模式创建表,则永远不会创建该表,因为该模式有语法错误,它应该是这样的
var schema = `
DROP TABLE IF EXISTS agent;
CREATE TABLE agent (
Id INTEGER PRIMARY KEY
);
DROP TABLE IF EXISTS task;
CREATE TABLE task (
Id INTEGER PRIMARY KEY
);
`
我猜你的代码与示例代码相同,所以在 init 函数中你跳过了错误检查db.Exec(schema)(你永远不应该对 中的任何函数这样做Go)。由于未检查错误并且执行模式时出错,因此永远不会创建表但程序继续,请更正您的模式并检查错误然后重试。在你的初始化函数中试试这个:
_, err := db.Exec(schema)
if err != nil {
log.Fatal(err)
}
TA贡献1775条经验 获得超8个赞
当我尝试使用错误的事务时,出现“内存中 sqlite 没有这样的表”错误。例子:
tx, err = DB.Begin()
if err != nil {
ErrorStatus = true
goto ErrorLabel
}
tempQuery = "INSERT INTO msg_to_like (msg_id, user_id) " +
"VALUES ('" + nmbr + "', " + usr + ");"
fmt.Println(tempQuery)
if _, err = DB.Exec(tempQuery); err != nil {
ErrorStatus = true
goto ErrorLabel
}
...
但有必要:
if _, err = tx.Exec(tempQuery); err != nil {
出现此错误后,使用的表崩溃了。
- 4 回答
- 0 关注
- 196 浏览
添加回答
举报