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

标签 sql csv terminal csvkit

我想为一些 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/

相关文章:

sql - 在商店过程中添加 dbo 或支持

mysql - 如何检查MySQL表中的最后一行是否有所需的值?

powershell - Powershell ConvertTo-CSV自定义 header

terminal - 如何使用外部工具将 gedit 中的当前代码行发送到终端并执行?

java - 如何执行java应用程序避免显示编译输出?

java - 从数据库填充JTable

mysql - 多动态行到多列MySQL

csv - ImageJ宏: saving csv file

ruby - 规范化不同格式的原始文本以在 Ruby 中创建对象

java - 如何在mac上准确设置和使用环境变量