你好!这是一篇关于我最近发现的名为sqlite-utils的好工具的快速帖子,来自工具类别。
最近我想用我的 Shopify 商店的数据做一些基本的数据分析。所以我想我会查询 Shopify API 并将我的数据导入 SQLite,然后我可以进行查询以获得我想要的图表。
但这似乎是很多无聊的工作,就像我必须编写一个模式并编写一个 Python 程序一样。因此,我四处寻找解决方案,并找到了sqlite-utils
,这是一个旨在轻松将任意数据导入 SQLite 以对数据进行数据分析的工具。
sqlite-utils 自动生成模式
Shopify 数据有大约十亿个字段,我真的不想为它输入架构。 sqlite-utils
解决了这个问题:如果我有一个 JSON 订单数组,我可以创建一个包含该数据的新 SQLite 表,如下所示:
import sqlite_utils orders = ... # (some code to get the `orders` array here) db = sqlite_utils.Database('orders.db') db['shopify_orders'].insert_all(orders)
如果有新字段(使用alter
),您可以更改架构
接下来,我遇到了一个问题,在下载的第 5 页上,JSON 包含一个我以前从未见过的新字段。
幸运的是, sqlite-utils
想到了这一点:有一个alter
标志,它将更新表的模式以包含新字段。 “`
这是代码的样子
db['shopify_orders'].insert_all(orders, alter=True)
您可以对现有行进行重复数据删除(使用upsert
)
接下来我遇到了一个问题,有时在进行同步时,我会从 API 下载数据,其中一些是新的,而另一些则不是。
所以我想做一个“upsert”,如果项目不存在,它只创建新行。 sqlite-utils
也想到了这个,还有upsert
方法。
为此,您必须指定主键。对我来说那是pk="id"
。这是我的最终代码的样子:
db['shopify_orders'].upsert_all( orders, pk="id", alter=True )
还有一个命令行工具
到目前为止,我已经讨论过使用sqlite-utils
作为库,但还有一个非常有用的命令行工具。
例如,这会将来自plants.csv
的数据插入到plants
表中:
sqlite-utils insert plants.db plants plants.csv --csv
格式转换
我还没有尝试过,但这是帮助文档中的一个很酷的示例,说明如何进行格式转换,例如将字符串转换为浮点数:
sqlite-utils insert plants.db plants plants.csv --csv --convert ' return { "name": row["name"].upper(), "latitude": float(row["latitude"]), "longitude": float(row["longitude"]), }'
这似乎对 CSV 非常有用,默认情况下,如果您不进行此转换,它通常会将数字数据解释为字符串。
元数据库似乎也不错
一旦我在 SQLite 中获得了所有数据,我就需要一种用它来绘制图形的方法。我想要一些仪表板,所以我最终使用了Metabase ,一个开源商业智能工具。我发现它非常简单,它似乎是一种将 SQL 查询转换为图形的非常简单的方法。
整个设置(sqlite-utils + metabase + SQL)感觉比我之前的设置更容易使用,我之前有一个自定义的 Flask 网站,它使用 plotly 和 pandas 来绘制图形。
就这样!
我对sqlite-utils
感到非常高兴,它非常易于使用,并且可以满足我的所有需求。
原文: https://jvns.ca/blog/2022/05/12/sqlite-utils–a-nice-way-to-import-data-into-sqlite/