我想为一些 csv 文件生成 sql 插入语句。
我可以使用单行 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)}'
但这仍然需要一些努力。 csvkit 中的 csvsql 似乎自动生成插入语句。我查了 documentation并使用了以下命令,但它不会生成插入语句。
$ 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
);
它生成创建表语句。但是文档说:
Generate SQL statements for a CSV file or execute those statements directly on a database.
我应该怎么做才能使用 csvkit 获取插入 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
运行它,你会得到类似的东西:
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;
将其捕获到文件中,您就是金子。如果您还想自动化插入阶段,也可以包装在 Python 子进程调用中,或通过管道传输到数据库命令行客户端。
如果您要插入到现有表中,则此方法适用于执行隐式类型转换的 MySQL 等 DBMS,因为 CSV 无法为过去字符串与数字的字段定义数据类型。对于像 Postgres 这样更严格的 DBMS,您需要编辑脚本文件中的数据类型。
关于sql - 如何让 csvkit/csvsql 为 csv 文件生成插入语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36449406/