为了账号安全,请及时绑定邮箱和手机立即绑定

将数据导入后灰色环境并导出到 CSV 格式

将数据导入后灰色环境并导出到 CSV 格式

Go
慕雪6442864 2022-09-19 17:17:45
我正在尝试使用postgresql(其中数据库位于远程主机)进行csv导入和导出数据。通常我会使用命令来做,但我需要能够通过Go来做到这一点,在那里我无法访问shell或没有安装psql的系统。psql\copy <table> from <local path> ...\copy <table> to <local path> ...数据本身应该非常轻(可能<2 MB的数据),因此我尽量不实现任何跟踪表中列的结构/模式。导入数据库时,我想用库/代码来推断表的架构,并将数据推送到表中。关于如何实现这一点的任何建议?我不确定是否有任何Go或或允许这样做,而无法指定列。对此有什么建议吗?database/sqlpgxpq编辑:我最终使用 https://github.com/joho/sqltocsv 进行数据库导出,这非常简单,我不必定义任何模式/结构。我没有代码,但我尝试并意识到我需要为它定义一些结构/模式。gorm
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

查看此页面: https://github.com/chop-dbhi/sql-importer

  1. 自动创建表

  2. 唯一性,而不是空检测。

  3. 支持宽度超过 1600 列的 CSV 文件(帖子限制)


查看完整回答
反对 回复 2022-09-19
?
桃花长相依

TA贡献1860条经验 获得超8个赞

我找到了用包装来做这件事的方法(多亏了@Gustavo川本的建议)。这是我的导入和导出:pgx


package main


import (

    "fmt"

    "os"


    "github.com/jackc/pgx"

)


func main() {

    pgxConConfig := pgx.ConnConfig{

        Port:     5432,

        Host:     "remote_host",

        Database: "db_name",

        User:     "my_user",

        Password: "my_password",

    }


    conn, err := pgx.Connect(pgxConConfig)

    if err != nil {

        panic(err)

    }

    defer conn.Close()


    tables := []string{"table1", "table2", "table3",}


    import_dir := "/dir_to_import_from"

    export_dir := "/dir_to_export_to"

    

    for _, t := range tables {

        f, err := os.OpenFile(fmt.Sprintf("%s/table_%s.csv", import_dir, t), os.O_RDONLY, 0777)

        if err != nil {

            return

        }

        f.Close()


        err = importer(conn, f, t)

        if err != nil {

            break

        }


        fmt.Println("  Done with import and doing export")

        ef, err := os.OpenFile(fmt.Sprintf("%s/table_%s.csv", export_dir, t), os.O_CREATE|os.O_WRONLY, 0777)

        if err != nil {

            fmt.Println("error opening file:", err)

            return

        }

        ef.Close()


        err = exporter(conn, ef, t)

        if err != nil {

            break

        }

    }

}


func importer(conn *pgx.Conn, f *os.File, table string) error {

    res, err := conn.CopyFromReader(f, fmt.Sprintf("COPY %s FROM STDIN DELIMITER '|' CSV HEADER", table))

    if err != nil {

        return err

    }

    fmt.Println("==> import rows affected:", res.RowsAffected())


    return nil

}


func exporter(conn *pgx.Conn, f *os.File, table string) error {

    res, err := conn.CopyToWriter(f, fmt.Sprintf("COPY %s TO STDOUT DELIMITER '|' CSV HEADER", table))

    if err != nil {

        return fmt.Errorf("error exporting file: %+v", err)

    }

    fmt.Println("==> export rows affected:", res.RowsAffected())

    return nil

}


查看完整回答
反对 回复 2022-09-19
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信