我想为某些csv文件生成sql insert语句。
我可以使用单线程awk脚本执行此操作,例如:
T(n) = Theta(floor(lg(n))^2) = Theta(lg(n)^2)
但这还需要一些努力。 csvkit里面的csvsql似乎会自动生成insert语句。我检查了Updated Fiddle并使用了以下命令但它没有生成插入语句。
awk -F "\t" '{printf("INSERT INTO T_COMMON_ENUM_VALUE (id,name,category_id) values (%s, '\''%s'\'', %s, %s);\n", $1, $2, $3, $4)}'
它生成create table语句。但文件说:
$ 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
);
如何使用csvkit获取insert sql语句?
答案 0 :(得分:2)
这是一种完全由数据驱动的方式。有点傻,但它有效。
#!/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,您需要编辑脚本文件中的数据类型。
答案 1 :(得分:1)
查看文档,我猜是这样的:
如果目标表T_COMMON_ENUM_VALUE已存在:
$ csvsql --tables T_COMMON_ENUM_VALUE --insert --no-create data02.csv
如果目标表T_COMMON_ENUM_VALUE不存在:
$ csvsql --tables T_COMMON_ENUM_VALUE --insert data02.csv
这应该只输出脚本,如果你想要对你的数据库执行语句,你需要添加--db CONNECTION_STRING
,例如:
$ csvsql --db mssql://user:pass@host:port/database --tables T_COMMON_ENUM_VALUE --insert data02.csv
我希望这会有所帮助
答案 2 :(得分:0)
使用csvsql生成插入或删除SQL脚本可能没有直接的解决方案;至少我拼命地需要的时候找不到自己。但是,--query
选项允许我们自己准备这些陈述,从而帮助我们解决问题。当然,它需要一点点努力,但它的回报非常好。
这是一个例子。我有一个csv文件(称为test2.csv)。这就是我能够为csv文件中的所有行生成insert语句的方法。
csvsql --query "SELECT 'insert into test2 values (''' ||
trim(ifnull(my_table.survived, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.RECORD_TYPE, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.BASE_HIN, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.SUFFIX, 'null123')) ||''',''' ||
trim(ifnull(my_table.name, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.ADDRESS_1, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.ADDRESS_2, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.CITY, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.STATE, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.PRIMARY_ZIP, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.COUNTRY, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.TELEPHONE, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.CLASS_OF_TRADE, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.DEA, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.DATE_HIN_ASSIGNED, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.DATE_LAST_EDITED, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.STATUS, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.VERIFIED, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.LAST_ACTION_CODE, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.REASON_CODE, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.REFERBACK_CODE, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.SUBSET, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.UPIN, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.SPECIALTY, 'null123')) ||''' ,''' ||
trim(ifnull(my_table.FAX, 'null123')) ||''' )'FROM test2 as my_table WHERE survived='0'" test2.csv > insert.sql
确保这是一行,因为csvsql不喜欢断行。
此外,准备好insert.sql
后,您需要删除标题行,删除双引号(从所有行中删除),然后使用= 'null123'
查找并替换is null
。