Golang Go语言中开发了一款命令行的数据库导入导出工具 Heimdall

发布于 1周前 作者 wuwangju 来自 Go语言

Heimdall 是一款专门为 MySQL 设计的命令行导入导出工具,使用它,你可以通过写 SQL 的方式,将查询结果直接导出 xlsx 、csv 、markdown 、html 、json 、yaml 、xml 、sql 等格式的文件,也可以将 xlsx 和 csv 格式的文件导入到数据库表中。

项目地址:

https://github.com/mylxsw/heimdall

命令行选项

heimdall 支持以下命令

  • import (aka load) 将 xlsx 或者 csv 文件导入到数据库表中
  • export (aka query) 将 SQL 查询结果导出到各种格式的文件

import/load

使用 import/load 命令,你可以从 xlsx 或者 csv 文件导入数据库到数据表中。支持以下命令行选项:

  • --host value, -H value MySQL host (default: "127.0.0.1")
  • --port value, -P value MySQL port (default: 3306)
  • --user value, -u value MySQL user (default: "root")
  • --password value, -p value MySQL password
  • --database value, -d value MySQL database
  • --connect-timeout value database connect timeout (default: 3s)
  • --debug, -D Debug mode (default: false)
  • --file value, -i value, --input value [ --file value, -i value, --input value ] input excel or csv file path, this flag can be specified multiple times for importing multiple files at the same time
  • --table value, -t value target table name
  • --field value, -f value [ --field value, -f value ] field map, eg: excel_field:db_field, this flag can be specified multiple times
  • --include value, -I value [ --include value, -I value ] include fields, if set, only these fields will be imported, this flag can be specified multiple times
  • --exclude value, -E value [ --exclude value, -E value ] exclude fields, if set, these fields will be ignored, this flag can be specified multiple times
  • --csv-sepertor value csv file sepertor, default is ',' (default: ",")
  • --tx, -T import data using transaction, all success or all failure, only work with InnoDB or other engines that support transaction (default: false)
  • --dry-run perform import tests to verify correctness of imported files, but do not commit transactions, only work with InnoDB or other engines that support transaction (default: false)
  • --help, -h show help (default: false)

export/query

使用 export/query 命令,你可以将 SQL 查询结果导出到各种格式的文件,当前支持 JSON/YAML/Markdown/CSV/XLSX/HTML/SQL 等格式。支持以下命令行选项::

  • --host value, -H value MySQL host (default: "127.0.0.1")
  • --port value, -P value MySQL port (default: 3306)
  • --user value, -u value MySQL user (default: "root")
  • --password value, -p value MySQL password
  • --database value, -d value MySQL database
  • --connect-timeout value database connect timeout (default: 3s)
  • --debug, -D Debug mode (default: false)
  • --sql value, -s value SQL statement
  • --format value, -f value output format, support csv, json, yaml, xml, table, html, markdown, xlsx, plain, sql (default: "csv")
  • --output value, -o value write output to a file, default output directly to STDOUT
  • --streaming, -S whether to use streaming output, if using streaming output, it will not wait for the query to complete, but output line by line during the query process. The output format only supports csv/xlsx/json/plain/sql (default: false)
  • --no-header, -n do not write table header (default: false)
  • --query-timeout value, -t value query timeout, when the stream option is specified, this option is invalid (default: 2m0s)
  • --xlsx-max-row value the maximum number of rows per sheet in an Excel file, including the row where the header is located (default: 1048576)
  • --table value when the format is sql, specify the table name
  • --help, -h show help (default: false)

示例

将 xlsx 文件内容导入到数据库表 people 中,标题 区域 对应字段 area ,姓名对应 name ,身份证号对应 idcard:

heimdall import --host 127.0.0.1 --port 3306 --database example --user root --password root \
    --table people \
    --field 区域:area \ 
    --field 姓名:name \
    --field 身份证号码:idcard \
    --file ~/Downloads/data.xlsx

从业务库中导出最近 30 天新增的客户企业清单为 Excel 文件

heimdall export --database example --host 127.0.0.1 --user root --password root \
      --sql "SELECT id, name AS '企业名称', address AS '企业地址', city_name AS '城市', district_name AS '区县', DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') AS '创建时间' FROM enterprise WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY) ORDER BY id DESC" \
      --streaming \
      --format xlsx \
      --output 最近 30 天新增企业列表.xlsx

Golang Go语言中开发了一款命令行的数据库导入导出工具 Heimdall

更多关于Golang Go语言中开发了一款命令行的数据库导入导出工具 Heimdall的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

17 回复

不错哦,准备试试

更多关于Golang Go语言中开发了一款命令行的数据库导入导出工具 Heimdall的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


最近正在思考 MySQL 的备份就看到这个帖子,及时雨啊,感谢楼主。

支持一下。

非常不错 。每年都有几次 10g 左右的 mysql 数据搬迁 。不知道对于大文件导入导出内存怎么样,如果半路崩溃是怎么处理的 。能否兼容 tidb 。

老哥 10G 的数据库迁移用的什么方案?

可视化的话 会不会更爽

支持,另外问下如果有特殊字符,比如双引号,能够正确导出为 csv 之类的吗?

没问题的,特殊字符都是 ok 的

heimdall 是一个导航页工具呀,这都能重名,世界真小
https://github.com/linuxserver/Heimdall

不支持 SELECT * FROM table name 这种``的语法嘛

./heimdall export --host 127.0.0.1 --port 3306 --database falcon --user root --password xxxxxx --format xlsx --output 1.xls

panic: runtime error: index out of range [-1]

goroutine 1 [running]:
github.com/mylxsw/heimdall/commands.readAll({0xbe7720?, 0xc00009c000?}, 0x3b)
/Users/mylxsw/Workspace/codes/github/heimdall/commands/global.go:26 +0x2c5
github.com/mylxsw/heimdall/commands.resolveExportOption(0xc0002ad648?)
/Users/mylxsw/Workspace/codes/github/heimdall/commands/export.go:44 +0x85
github.com/mylxsw/heimdall/commands.ExportCommand(0xc0000d7e00?)
/Users/mylxsw/Workspace/codes/github/heimdall/commands/export.go:65 +0xc5
github.com/urfave/cli/v2.(*Command).Run(0xc0000d7e00, 0xc0000a37c0, {0xc0002de2d0, 0xf, 0xf})
/Users/mylxsw/Deps/Go/pkg/mod/github.com/urfave/cli/[email protected]/command.go:271 +0xaab
github.com/urfave/cli/v2.(*Command).Run(0xc0002e03c0, 0xc0000a3680, {0xc0000a4000, 0x10, 0x10})
/Users/mylxsw/Deps/Go/pkg/mod/github.com/urfave/cli/[email protected]/command.go:264 +0xd0d
github.com/urfave/cli/v2.(*App).RunContext(0xc00009a1e0, {0xbeb040?, 0xc0000a60a0}, {0xc0000a4000, 0x10, 0x10})
/Users/mylxsw/Deps/Go/pkg/mod/github.com/urfave/cli/[email protected]/app.go:329 +0x665
github.com/urfave/cli/v2.(*App).Run(…)
/Users/mylxsw/Deps/Go/pkg/mod/github.com/urfave/cli/[email protected]/app.go:306
main.main()
/Users/mylxsw/Workspace/codes/github/heimdall/main.go:68 +0x69a

想给同事 show 一把的,结果没秀出来

少了个 --sql

明白了,这是个表级别的工具,不是库级别的。

针对您开发的Heimdall这款基于Golang的命令行数据库导入导出工具,以下是我的一些专业见解:

Heimdall作为一款命令行工具,在数据库管理方面展现出了独特的价值。在Go语言生态中,数据库操作通常依赖于database/sql包以及相应的数据库驱动,如MySQL、PostgreSQL等。Heimdall若能提供简洁易用的命令行接口,将极大地方便数据库管理员和开发人员进行数据的导入导出操作。

此外,现有的数据库迁移工具如Golang-Migrate,已经证明了命令行工具在数据库管理领域的实用性。Golang-Migrate支持多种数据库和迁移源,能够读取本地或远程的迁移文件,并按照正确的顺序应用到目标数据库中。Heimdall在功能设计上或许可以借鉴这些成熟工具的经验,以提供更全面、更稳定的数据库导入导出解决方案。

同时,考虑到数据安全和完整性的重要性,Heimdall在数据导入导出过程中应确保数据的准确性和一致性,避免数据丢失或损坏。此外,提供灵活的配置选项和错误处理机制也是提升用户体验的关键。

总之,Heimdall作为一款基于Golang的命令行数据库导入导出工具,具有广阔的应用前景。期待它能够在数据库管理领域发挥更大的作用。

回到顶部