企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## 内存数据库 - 没有打开任何磁盘文件,而是纯粹在内存中创建一个新的数据库。一旦关闭数据库连接,数据库就不复存在 - 在 3.5 以上版本支持在进程间共享内存 ### 基本的内存数据库 go 示例 ``` db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { t.Error(err) } db.AutoMigrate(User{}) db.Create(&User{ UserName: "Bob", Password: "123", }) var user User db.First(&user) t.Logf("%#v",user) // main.User{ID:0x1, UserName:"Bob", Password:"123"} ``` #### 内存与文件数据库的性能对比 <details> <summary>demo_test.go</summary> ``` func BenchmarkSqlite(b *testing.B) { b.Run("内存数据库",BenchmarkMemory) b.Run("文件数据库",BenchmarkFile) } func BenchmarkMemory(b *testing.B) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { b.Error(err) } db.AutoMigrate(User{}) db.Create(&User{ UserName: "Bob", Password: "123", }) for i := 0; i < b.N; i++ { var user User db.First(&user) } } func BenchmarkFile(b *testing.B) { db, err := gorm.Open(sqlite.Open("test2.db"), &gorm.Config{}) if err != nil { b.Error(err) } db.AutoMigrate(User{}) db.Create(&User{ UserName: "Bob", Password: "123", }) for i := 0; i < b.N; i++ { var user User db.First(&user) } } ``` </details> <br/> output ``` BenchmarkSqlite/内存数据库-4 59682 21035 ns/op BenchmarkSqlite/文件数据库-4 16357 85115 ns/op ``` ### 共享内存 1. 共享内存可以在不同进程简共享 2. 共享内存有两种写作方式 方式一: memory:?cache=shared 方式二: file::memdb1?mode=memory&cache=shared ,此方式可以指定内存数据库名字 <details> <summary>demo_test.go</summary> ``` func TestMemoryShare(t *testing.T) { //db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared")) db, err := gorm.Open(sqlite.Open("file::memdb1?mode=memory&cache=shared")) if err != nil { t.Error(err) } db.AutoMigrate(User{}) db.Create(&User{ UserName: "Bob", Password: "123", }) //db1, err := gorm.Open(sqlite.Open("file::memory:?cache=shared")) db1, err := gorm.Open(sqlite.Open("file::memdb1?mode=memory&cache=shared")) if err != nil { t.Error(err) } var user User db1.First(&user) t.Logf("%#v",user) } ``` </details> <br/>