使用带有csv文件的sql语句将数据导入/导出到关系数据库/从关系数据库导出数据
sqlcsv的Python项目详细描述
sqlcsv
简单的命令行工具,可用于:
- 从数据库中选择数据并将结果导出为csv
- 从csv将数据插入数据库
请注意,它只适用于python 3,而不是2。
安装
通过PYPI:
$ pip3 install sqlcsv
它没有将任何数据库驱动程序指定为显式依赖项,因此请安装所需的驱动程序:
# MySQL
$ pip3 install mysqlclient
# PostgreSQL
$ pip3 install psycopg2
基本用法
在下面的示例中,使用了带有mysql的表模式:
CREATETABLEtesttable(idINTAUTO_INCREMENTPRIMARYKEY,int_colINT,float_colFLOAT,varchar_colVARCHAR(255))
数据库连接
可以使用sqlalchemy url形式的--db url
选项指定数据库连接:
$ sqlcsv --db-url 'mysql://testuser:testpassword@127.0.0.1:3306/testdb' <subcommand> ...
如果设置为:
$ export SQLCSV_DB_URL='mysql://testuser:testpassword@127.0.0.1:3306/testdb'
$ sqlcsv <subcommand> ...
从这里开始,它们从命令行示例中被省略。
选择
假设我们已经有了以下记录:
+----+---------+-----------+-------------+
| id | int_col | float_col | varchar_col |
+----+---------+-----------+-------------+
| 1 | 1 | 1 | aaa |
| 2 | 2 | 2 | bbb |
| 3 | NULL | NULL | NULL |
+----+---------+-----------+-------------+
使用select
子命令并使用--sql提供
select
查询选项:
$ sqlcsv select --sql 'SELECT * FROM testtable'
id,int_col,float_col,varchar_col
1,1,1.0,aaa
2,2,2.0,bbb
3,,,
如果要将结果保存到文件,请使用--outfile
选项:
$ sqlcsv select --sql 'SELECT * FROM testtable' --outfile out.csv
插入
假设我们在input.csv中已经有了以下数据集:
int_col,float_col,varchar_col
1,1.0,aaa
2,2.0,bbb
使用insert
子命令并使用--sql
选项提供带占位符的insert
查询,然后使用--types
选项指定每个字段的类型:
$ pip3 install sqlcsv
0
表中的结果记录为:
$ pip3 install sqlcsv
1
注意,--types
中的类型名与python原语类型函数名相同。
它也可以是短格式,如--I、F、S类
目前它只支持int
,float
和str
空值
csv文件可能包含空单元格,如:
$ pip3 install sqlcsv
2
如果要在数据库中将它们视为"null",请在插入之前使用--nullable
选项转换它们:
$ pip3 install sqlcsv
3
结果是:
$ pip3 install sqlcsv
4
请注意,--nullable
的值必须是true
或false
中的一个,并且它们也可以短形式写成t
或f
。
更多选项
CSV方言
如果所需的输入或输出是制表符分隔的(TSV),请使用--tab
选项:
$ pip3 install sqlcsv
5
有关其他格式设置,请参见sqlcsv--help
。
基本上,它支持与python标准库中的csv包相同的方言规范。
从文件中读取SQL
在select
和insert
子命令中,可以使用--sql file
选项intead of--sql
从文件中读取查询:
$ pip3 install sqlcsv
6
查询前和查询后
如果您需要在主查询运行之前/之后执行短查询,它提供--pre-sql
和--post-sql
选项来满足这些需要:
$ pip3 install sqlcsv
7
分块插入
当您将大量记录导入数据库时,--chunk size
选项有助于将文件内容分割成不同的部分并将每个部分重复传输到数据库,从而节省内存使用量。
$ pip3 install sqlcsv
8
磨合事务
如果希望在单个命令调用中执行多个查询(如--pre-sql
或--post-sql
指定的查询)在同一事务中运行,请使用--transaction
选项,如下所示:
$ pip3 install sqlcsv
9
将此选项与--chunk size
一起使用也是一种良好的做法,以便原子地执行分块插入,并避免在取消或中止查询时在表中留下不完整的数据。
其他工具之间的比较
加载或复制
主要的rdbms通常有内置的指令来从文件导入数据,比如mysql的load
或postgresql的copy
。
很明显他们是您可以考虑但也有一些限制:
- 很少有平台支持跨网络导入/导出;其他平台只能从本地文件导入/导出
- 每个平台的数据格式或指令规范各不相同
sqlcsv远程工作并提供统一的接口(除了sql方言)。
CSV套件
csvkit是操作csv文件的流行工具包。 它提供了用于从/到SQL数据库导出/导入数据的sql2csv和csvsql命令。 在选择sqlcsv之前考虑使用它们,如果它们只是满足您的需要,因为它们有更多的用户和贡献者。 Hoever,选择sqlcsv可能有几个原因(这就是创建它的原因):
- csvkit依赖于多个库,包括agate,但并非所有库都需要用于sql数据库和csv文件之间的互操作性。 sql csv使用python标准库中的csv包与csv文件交互,并使用sqlalchemy查询sql数据库,从而减少了对库的依赖。
- csvkit的csvsql命令只使用表名进行导入,这使它易于使用。
但是,如果csv文件只包含部分列,而其他列则由sql表达式动态生成,则有时会造成不便。
相比之下,sqlcsv的
insert
子命令采用insert
语句,该语句可能很冗长,但提供了更大的灵活性。
熊猫
如果不关心库依赖关系,则不需要指定自定义的insert
语句,甚至不需要命令行接口,然后,只需使用熊猫'数据框。to_sql或阅读SQL。
如果与dataframe.to_csv或read_csv一起使用,它们将对您有很大帮助。
embulk
如果数据集太大,需要优化(如并行处理),或者需要一些复杂的I/O功能(如重试),请考虑使用embulk。 它还提供完善的插件生态系统,支持各种数据存储和数据格式。