【问题标题】:How to have two GORM sessions to the same in-memory database?如何有两个 GORM 会话到同一个内存数据库?
【发布时间】:2019-12-28 15:19:44
【问题描述】:

我正在尝试测试 GORM 代码。代码路径打开一个新的 GORM 会话。第一个会话将数据添加到 GORM,第二个会话使用它。在测试时,GORM 似乎会在使用内存参数:memory: 时忘记第一个会话的数据。我什至尝试了cache=shared 选项,但没有成功。

这是一个示例测试:

type testRecord struct{
    ID string
    Data string
}


func TestOpenGormTwice(t *testing.T){
    cxn:=":memory:?cache=shared"
    database, err := gorm.Open("sqlite3", cxn)
    assert.NoError(t, err)

    err=database.CreateTable(&testRecord{}).Error
    assert.NoError(t, err)

    err=database.Create(testRecord{
        ID:   "1",
        Data: "abc",
    }).Error
    assert.NoError(t, err)

    tr:=testRecord{}
    err=database.First(&tr).Error
    assert.NoError(t, err)

    assert.True(t, database.HasTable(&testRecord{}))

    //Open :memory: again, hopefully it won't forget what was saved last time
    database2, err := gorm.Open("sqlite3", cxn)
    assert.NoError(t, err)
    assert.True(t, database2.HasTable(&testRecord{}))
}

测试在最后一个 assert.True 处失败。如何更改此代码以通过最后的测试?

我也试过cxn:="memdb1?mode=memory&cache=shared",它似乎可以工作,但实际上它并没有进入内存模式as described in the Sqlite docs

【问题讨论】:

  • cxn:="file:memdb1?mode=memory&cache=shared" 是否如sqllite.org 所述工作?

标签: sqlite go go-gorm


【解决方案1】:

这有效:cxn:="file:memdb1?mode=memory&cache=shared"

感谢@karmakaze 的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2020-08-26
    相关资源
    最近更新 更多