sqlite-utils:用於構建SQLite數據庫的Python庫和命令行工具

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

sqlite-utils是我在過去六個月中一直在構建的Python庫和命令行工具的合集,旨在儘可能快速簡便地創建新的SQLite數據庫。

它是我的Datasette項目構建的工具生態系統的一部分。

我花了整個週末為它添加各種令人興奮的命令行選項,現在已經準備完畢。

一個用於快速創建數據庫的python庫

Datasette背後的一個核心思想是,SQLite是發佈各種有趣的結構化數據的理想格式。DataSette接收任意SQLite數據庫,並添加可瀏覽的Web界面、JSON API以及將表和查詢導出為CSV的功能。

這個程序的另一半是創建SQLite數據庫的工具。 csvs-to-sqlite是我第一次嘗試搭建命令行工具,而sqlite-utils採用更加靈活和全面的方法。

我從去年開始研究sqlite-utils,作為我的項目Analyze US Election Russian Facebook Ads的一部分。 最初的目標是構建一個可以提高在Jupyter notebook中構建新的SQLite數據庫效率的工具庫。

該庫背後的核心思想是,您可以為其提供一個Python字典列表(相當於JSON對象),它將自動創建具有正確模式的SQLite表,然後將這些項插入到新表中。

為了進一步說明,讓我們使用這個由NASA發佈的隕石墜落數據JSON文件創建一個數據庫(通過由Justin Dorfman策劃的awesome-json-datasets發現)。

以下是將數據快速存入數據庫的代碼實現:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

這兩行代碼在磁盤上創建了一個新的sqlite數據庫,名為meetites.db,在該文件中創建了一個名為meetites的表,根據輸入的數據檢測必要的列,插入所有行並將id列設置為主鍵。

要查看生成的數據庫,請運行命令datasette meteorites.db並瀏覽地址:http://127.0.0.1:8001/。

使用這個工具庫還可以做更多的事情。 您可以批量創建表,插入和更新數據,配置外鍵關係,配置SQLite全文搜索等等。 我您通過查閱文檔以獲取所有詳細信息。

sqlite-utils命令行工具

這是過去幾天完成的一個很有趣的新工具。

首先從PyPI安裝該工具庫,使用該命令 : pip3 install sqlite-utils

讓我們先下載一份我在Analyzing US Election Russian Facebook Ads項目中創建的數據庫russian-ads.db的副本(4MB):

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

我們可以使用tables命令查看數據庫中的表及其計數列表:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

默認情況下,sqlite-utils命令將輸出格式化的JSON數據。 您可以使用--csv選項獲取CSV:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

或者,如果您想要一個漂亮的ASCII藝術表,請使用--table(或快捷方式-t):

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

表格視圖是建立在tabulate之上的,它提供了幾十種表格變化。運行sqlite utils tables--help命令以獲取完整的列表,運行try--table-fmt=rst獲取可以直接粘貼到reStructuredText文本中的輸出(用於編寫文檔)。

到目前為止,我們只看了一個表格列表。 讓我們運行一個SQL查詢:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

同樣,這裡可以使用--csv輸出為CSV,或者使用--table輸出為表格。

默認的JSON輸出是包裝在數組中的對象。 使用--arrays來獲取數組。 更有趣的是: --nl會以帶換行符分隔的JSON格式輸出,如下所示:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

對於傳輸到其他工具來說,這是一種非常有趣的格式。

在命令行上通過JSON創建數據庫

sqlite-utils insert命令可用於通過將JSON或CSV直接傳輸到工具中來創建新表。 它和我之前演示的Python函數中的.insert_all是相同的。

以下是如何直接從命令行創建隕石相關數據庫:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

這將使用名為meteorites.db的SQLite數據庫文件(如果它尚不存在則創建一個),創建或使用名為meteorites的表並從中的標準輸入(通過管道)讀取數據。 您可以使用文件名替換 "-" 來從磁盤上的文件中讀取數據。

insert命令可接受多種格式,默認情況下它會接受JSON數組對象,但是可以使用--nl接受換行分隔的JSON格式的數據,使用--csv接受csv格式的數據。

這意味著您可以組合這些工具!讓我們通過從舊數據庫中導出數據來創建一個全新的數據庫,使用換行分隔的JSON作為中間格式:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

這將創建一個名為veterans.db的新文件,其中包含一個廣告表,其中只包含在正文中某處提到退伍軍人的廣告。

由於我們使用的是JSON,所以我們可以在組合中引入其他命令行工具。

jq是一個簡潔的小工具,可以使用它自己的小眾語言從JSON文件中提取數據。

諾貝爾獎API提供了一個JSON文件,其列出了所有諾貝爾獎獲得者,但它們作為一個數組包含在一個最外層的“獲獎者”鍵中。sqlite utils需要一個一維數組,因此我們可以使用jq來獲取:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

現在我們成功獲得一個名為nobel.db的文件,其中包含所有的諾貝爾獎獲得者。

最近Datasette增強了導出換行分隔的JSON的能力,因此我們還可以使用此功能直接從數據集使用數據。讓我們來看看鮑勃羅斯所作的《繪畫的樂趣》中有海灘的每一集:

sqlite-utils:用于构建SQLite数据库的Python库和命令行工具

更多功能

與Python API一樣,sqlite-utils命令行工具還有許多其他選項和大量的文檔。

我非常喜歡圍繞數據集建立一個工具生態系統。sqlite utils是這裡的重點:它是我正在構建的其他工具的基礎,例如db-to-sqlite(它可以將任何sqlAlchemy支持的數據庫直接導出到磁盤上的sqlite文件)。

我發現自己越來越傾向於使用sqlite作為進行各種臨時分析的首選,我也很高興嘗試使用sqlite-utils的這些新命令行能力來進行真實的數據搜索任務。

發佈於2019年2月25日 上午3:29 在Twitter上關注@simonw

英文原文:https://simonwillison.net/2019/Feb/25/sqlite-utils/
譯者:黃葉飛舞


分享到:


相關文章: