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语句?
这是一种完全数据驱动的方式。有点愚蠢,但它有效。
#!/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,您需要编辑脚本文件中的数据类型。
看看文档,我猜是这样的:
如果目标表 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)
我希望这有帮助
| 归档时间: |
|
| 查看次数: |
1688 次 |
| 最近记录: |