使用带有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类

目前它只支持intfloatstr

空值

csv文件可能包含空单元格,如:

$ pip3 install sqlcsv
2

如果要在数据库中将它们视为"null",请在插入之前使用--nullable选项转换它们:

$ pip3 install sqlcsv
3

结果是:

$ pip3 install sqlcsv
4

请注意,--nullable的值必须是truefalse中的一个,并且它们也可以短形式写成tf

更多选项

CSV方言

如果所需的输入或输出是制表符分隔的(TSV),请使用--tab选项:

$ pip3 install sqlcsv
5

有关其他格式设置,请参见sqlcsv--help。 基本上,它支持与python标准库中的csv包相同的方言规范。

从文件中读取SQL

selectinsert子命令中,可以使用--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数据库导出/导入数据的sql2csvcsvsql命令。 在选择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_csvread_csv一起使用,它们将对您有很大帮助。

embulk

如果数据集太大,需要优化(如并行处理),或者需要一些复杂的I/O功能(如重试),请考虑使用embulk。 它还提供完善的插件生态系统,支持各种数据存储和数据格式。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java:字符串。RTL设备语言用标志“+”格式化,数字后加符号   java GAE作为桌面应用程序(Swing)的服务提供商   java将InputStream转换为FileInputStream不适用于Apache POI   java外部Voronoi库“网格”:什么是草图和处理?   重载重写的泛型方法java   java显示组织上设置的错误。springframework。验证。jsp中的错误对象   java一些Spring模型属性没有显示在我的JSP中   java无法编译Guava 23的SimpleTimeLimiter示例   java如何更改JTree中的“根”目录名?   java如何在安卓中对相对布局产生连锁反应?   java错误:org。冬眠例外SQLGrammarException:无法提取结果集,dateAccessed是未知列   如何使用java监听JSON文件更新   由抽象封闭类创建的匿名内部类能否通过反射确定实现类?