如何让csvkit/csvsql为csv文件生成插入语句?

Mer*_*glu 8 sql csv terminal csvkit

我想为某些csv文件生成sql insert语句.

我可以使用单线程awk脚本执行此操作,例如:

awk -F "\t" '{printf("INSERT INTO T_COMMON_ENUM_VALUE (id,name,category_id) values (%s, '\''%s'\'', %s, %s);\n", $1, $2, $3, $4)}'
Run Code Online (Sandbox Code Playgroud)

但这还需要一些努力.csvkit里面的csvsql似乎会自动生成insert语句.我检查了文档并使用了以下命令,但它不生成插入语句.

$ cat data02.csv
db_enumvalue_id db_enumvalue_name       db_enumcategory_id
800     ?irin   9

$ csvsql data02.csv
CREATE TABLE data02 (
        db_enumvalue_id INTEGER NOT NULL,
        db_enumvalue_name VARCHAR(18) NOT NULL,
        db_enumcategory_id INTEGER NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

它生成create table语句.但文件说:

Generate SQL statements for a CSV file or execute those statements directly on a database.
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能使用csvkit获取insert sql语句?

Chr*_*son 5

这是一种完全数据驱动的方式。有点愚蠢,但它有效。

#!/usr/bin/env bash

##
## ensure script stops on errors
set -eu
set -o pipefail

##
## load your data into a SQLite DB
csvsql test.csv --db=sqlite:///test.db --insert

##
## let SQLite generate the inserts
echo ".dump test" | sqlite3 test.db
Run Code Online (Sandbox Code Playgroud)

运行它,你会得到类似的东西:

BEGIN TRANSACTION;
CREATE TABLE test (
    id INTEGER NOT NULL,
    month VARCHAR(5) NOT NULL,
    market FLOAT NOT NULL,
    acme FLOAT NOT NULL
);
INSERT INTO "test" VALUES(1,'1/86',-0.061134,0.03016);
INSERT INTO "test" VALUES(2,'2/86',0.00822,-0.165457);
INSERT INTO "test" VALUES(3,'3/86',-0.007381,0.080137);
...
INSERT INTO "test" VALUES(60,'12/90',-0.026401,-0.190834);
COMMIT;
Run Code Online (Sandbox Code Playgroud)

将其捕获到文件中,您就成功了。如果您还想自动化插入阶段,也可以包装在 Python 子进程调用中,或者通过管道传输到数据库命令行客户端。

如果要插入到现有表中,此方法适用于执行隐式类型转换的 DBMS(例如 MySQL),因为 CSV 无法为过去字符串与数字的字段定义数据类型。对于像 Postgres 这样更严格的 DBMS,您需要编辑脚本文件中的数据类型。


Mtw*_*ark 1

看看文档,我猜是这样的:

如果目标表 T_COMMON_ENUM_VALUE 已存在:

$ csvsql --tables T_COMMON_ENUM_VALUE --insert --no-create data02.csv
Run Code Online (Sandbox Code Playgroud)

如果目标表 T_COMMON_ENUM_VALUE 不存在:

$ csvsql --tables T_COMMON_ENUM_VALUE --insert data02.csv
Run Code Online (Sandbox Code Playgroud)

这应该只输出脚本,如果您希望将语句执行到您的数据库,您需要添加--db CONNECTION_STRING,例如:

$ csvsql --db mssql://user:pass@host:port/database --tables T_COMMON_ENUM_VALUE --insert data02.csv
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助

  • 对我不起作用,它说“--insert 选项仅在指定 --db 或 --query 时有效。” (2认同)