从终端将 CSV 数据导入 SQL 数据库
将数据导入表格。
概括
数据科学家和该领域的其他专业人士经常需要处理来自多个数据源的数据。他们很快就会遇到将 CSV 文件中的数据导入 SQL 数据库的挑战。我非常喜欢使用终端,所以我想向大家展示如何通过终端完成这项操作。
先决条件
我将使用一个 Python 包来实现这个功能。我建议你在虚拟环境中工作。如果需要,可以参考Real Python 网站上关于虚拟环境的文章。我假设你使用的是 Python 3。
- 安装所需的软件包
pip install PyMySQL psycopg2 csvkit
PyMySQL:这是一个纯 Python MySQL 驱动程序,可以帮助我们使用 Python 连接到 MySQL 数据库。psycopg2
:这是最流行的 Python PostgreSQL 数据库适配器。csvkit
:它是一套用于转换和处理 CSV 文件的命令行工具。它提供了我们将要使用的csvsql模块,用于从 CSV 文件导入数据。
- 下载示例 CSV 文件customer_info.csv。
为了方便本教程的讲解,我上传了一个包含一些客户信息的 CSV 文件,您可以用来测试我即将介绍的这个工具。点击此链接即可下载。
- 创建一个新的 MySQL 或 Postgresql 数据库。我将其命名为test。数据将导入到我命名为customer_info 的表中。
导入您的数据
快速方法。
此方法会自动从 CSV 数据生成模式,创建表并将数据插入表中。db_user
:这是有权访问您创建的测试数据库的数据库用户。password
:这是该用户的密码。
对于 MySQL
csvsql --db 'mysql+pymysql://db_user:password@localhost/test' --tables customer_info --insert customer_info.csv
对于 PostgreSQL
csvsql --db 'postgresql:///test' --tables customer_info --insert customer_info.csv
更耗时(也更安全)的方法。
- 从终端生成创建customer_info表的查询语句。
对于 MySQL
csvsql -i mysql customer_info.csv
预期结果:
CREATE TABLE customer_info (
`contractId` DECIMAL(38, 0) NOT NULL,
`AccountNumber` DECIMAL(38, 0) NOT NULL,
`CreatedAt` TIMESTAMP NULL,
`Amount` DECIMAL(38, 0) NOT NULL,
`Count` DECIMAL(38, 0) NOT NULL,
`Duration` DECIMAL(38, 0) NOT NULL
);
以上结果是我们将用于在测试数据库中创建customer_info表的查询语句。您可以根据需要编辑生成的数据库模式。在本教程中,我将保持其原样。
对于 PostgreSQL
csvsql -i postgresql
预期结果:
CREATE TABLE customer_info (
"contractId" DECIMAL NOT NULL,
"AccountNumber" DECIMAL NOT NULL,
"CreatedAt" TIMESTAMP WITHOUT TIME ZONE,
"Amount" DECIMAL NOT NULL,
"Count" DECIMAL NOT NULL,
"Duration" DECIMAL NOT NULL
);
注意每个数据库对查询语句的要求不同。MySQL 使用单引号将查询语句括起来,而 PostgreSQL 使用双引号将查询语句括起来。
将数据导入表格。
在 MySQL 中
csvsql --db 'mysql+pymysql://db_user:password@host/test' --no-create --insert customer_info.csv
在 PostgreSQL 中
csvsql --db 'postgresql:///test' --no-create --insert customer_info.csv
概括
我们刚刚学习了如何使用 csvkit 包将 CSV 文件中的数据导入到 MySQL 和 PostgreSQL 数据库的表中。您可以采用直接的方法,它会自动创建表并插入数据。另一种方法(在我看来更安全,也更耗时)是生成创建表的查询语句,检查并编辑生成的表结构,然后将数据导入到表中。
CSVKIT 是每位数据科学家工具箱中都应该具备的强大工具。
文章来源:https://dev.to/mupati/import-csv-data-into-sql-databases-from-the-terminal-1apb