Go语言 数据库/sql.convertAssignRows内存泄漏

bqujaahr  于 2023-04-18  发布在  Go
关注(0)|答案(1)|浏览(208)

当我使用gorm并调用Find方法时,内存泄漏。
func(mp *message)ListMessage(ctx context.Context,ci *ClientInfo)([]Message,error){

tx := mp.db.WithContext(ctx).Raw(sql)
var mss []MessageSource
err := tx.Find(&mss).Error
if err != nil {
    return nil, err
}

return mss, nil

}

ws51t4hk

ws51t4hk1#

我不确定你问的问题,但无论如何我会尽力帮助你。让我分享一个代码片段,展示我通常如何使用RawFind方法。然后,我会带你完成所有相关部分。

package main

import (
    "fmt"
    "strings"

    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type Message struct {
    gorm.Model
    Description string
}

func main() {
    dsn := "host=localhost port=54322 user=postgres password=postgres dbname=postgres sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn))
    if err != nil {
        panic(err)
    }

    db.AutoMigrate(&Message{})
    defer db.Exec(`DELETE FROM "messages"`)

    db.Create(&Message{Description: "first"})
    db.Create(&Message{Description: "second"})
    db.Create(&Message{Description: "third"})

    var messages []Message
    // get data with SQL raw
    if err := db.Model(&Message{}).Raw(`SELECT * FROM "messages" ORDER BY "messages"."id"`).Scan(&messages).Error; err != nil {
        panic(err)
    }
    fmt.Println("printed with SQL Raw...")
    for _, v := range messages {
        fmt.Println(v.Description)
    }
    fmt.Println(strings.Repeat("#", 100))
    var messages2 []Message
    // get data with Find method
    if err := db.Model(&Message{}).Find(&messages2).Error; err != nil {
        panic(err)
    }
    fmt.Println("printed with Find...")
    for _, v := range messages2 {
        fmt.Println(v.Description)
    }
}

本代码主要分为三个部分。
开始
在这个阶段,您可以看到我在示例中使用的模型(Message)。然后,我打开了一个连接到我通过Docker运行的本地Postgres DB。最后,我调用Automigrate方法将结构(或模型)定义同步到DB中的表中,并插入了三条虚拟记录。

Raw + Scan方法

使用此选项,您可以手动指定要针对底层DB运行的查询。当您调用Scan方法时,查询实际上已经完成,该方法需要将结果Map到一个变量(例如messages变量)。请注意,您也可以使用?符号参数化该语句。

Find方法

相反,Find方法期望将结果Map到的变量作为第一个参数。然后,它还期望用于记录过滤的条件。如果没有提供,则意味着您希望获得Model方法指定的表中存在的所有记录。
如果你坚持使用这些方法,你应该不会收到任何关于内存泄漏的错误或警告。让我知道这是否能帮助你找出问题,或者如果我错过了什么,谢谢!

相关问题