ZBLOG

gorm 使用 pg.CopyFroom

gorm 使用 CopyFrom 方法可以将数据从一个可读流(如文件或网络)复制到 PostgreSQL 数据库中。该方法的语法如下:

// CopyFrom 将数据从一个可读流复制到数据库中。
func (db *DB) CopyFrom(r io.Reader, table string, columns []string, options ...CopyOption) error

参数说明:

  • r:可读流,可以是文件、网络等。
  • table:目标表名。
  • columns:插入的列名,如果为空,则使用表的全部列。
  • options:可选项,如DelimiterNull等。

示例:

package main

import (
    "database/sql"
    "os"

    "github.com/lib/pq"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type User struct {
    ID   uint
    Name string
}

func main() {
    dsn := "postgres://user:password@localhost:5432/dbname?sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    // 创建 users 表
    db.AutoMigrate(&User{})

    // 插入数据
    data := []User{{Name: "Alice"}, {Name: "Bob"}}
    f, err := os.CreateTemp("", "data.*.csv")
    if err != nil {
        panic(err)
    }
    defer os.Remove(f.Name())
    encoder := pq.NewEncoder(f)
    for _, row := range data {
        if err := encoder.Encode(row); err != nil {
            panic(err)
        }
    }
    if _, err := f.Seek(0, 0); err != nil {
        panic(err)
    }
    if err := db.Exec(`COPY users (name) FROM STDIN WITH CSV`).Error; err != nil {
        panic(err)
    }
    if err := db.Session(&gorm.Session{AllowGlobalUpdate: true}).Raw(`
        COPY users (id, name) FROM STDIN WITH CSV
    `).Rows(sql.RowsFromCSV(f)).Error; err != nil {
        panic(err)
    }
}

在上面的示例中,我们使用了两种方式插入数据:第一种方式将每行数据编码为 CSV 格式写入文件,然后使用 PostgreSQL 的 COPY 命令从文件中读取数据并插入到数据库中;第二种方式直接将每行数据作为参数传递给 SQL 语句,然后通过 Rows 方法将其转换为可读流传输到数据库中。注意,在使用 COPY 命令时需要确保表的列名和数据的列名一一对应,并且要设置正确的分隔符和数据格式。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=992

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?