gorm 使用 CopyFrom 方法可以将数据从一个可读流(如文件或网络)复制到 PostgreSQL 数据库中。该方法的语法如下:
// CopyFrom 将数据从一个可读流复制到数据库中。
func (db *DB) CopyFrom(r io.Reader, table string, columns []string, options ...CopyOption) error
参数说明:
r
:可读流,可以是文件、网络等。table
:目标表名。columns
:插入的列名,如果为空,则使用表的全部列。options
:可选项,如Delimiter
、Null
等。
示例:
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
命令时需要确保表的列名和数据的列名一一对应,并且要设置正确的分隔符和数据格式。