1. 程式人生 > 實用技巧 >Python內建庫SQlite3使用指南

Python內建庫SQlite3使用指南

如果你是軟體開發人員,相信你一定知道或者曾經使用過一個非常輕量級的資料庫——SQLite。它具有作為關係資料庫所需的幾乎所有功能,但是這個資料庫把所有功能都儲存在一個檔案中。在其官方網站上,SQLite的主要應用場景包括:

  • 嵌入式裝置和物聯網
  • 資料分析
  • 資料傳輸
  • 檔案存檔或資料容器
  • 內部或臨時資料庫
  • 在演示或測試期間替代企業資料庫
  • 教育、培訓和測試
  • 實驗性SQL語言擴充套件

當然,SQLite還有很多其他功能,在此不一一列舉,感興趣的同學可以去看官方文件:https://www.sqlite.org/whentouse.html

最重要的是,SQLite實際上是作為Python庫內建的。換言之,你不需要安裝任何伺服器端/客戶端軟體,也不需要執行某個服務,只要你在Python中匯入庫並開始程式設計,那麼你就有了一個關係資料庫管理系統!

匯入和使用

這裡我們說“內建”的意思就是,你甚至不需要執行 pip install ,就能獲取庫。只需要通過以下方式匯入:

import sqlite3 as sl 

1.建立與資料庫的連線

我們根本不需要為驅動程式、連線字串等煩惱。可以直接建立一個 SQLite 資料庫,並擁有一個簡單的連線物件:

con = sl.connect('my-test.db') 

執行此行程式碼後,我們就已經建立並連線到該資料庫上。 如果要求Python連線的資料庫不存在,它就會自動幫我們建立一個空資料庫。 如果我們已經建立了資料庫,就能用上面完全相同的程式碼連線到現有資料庫。

2.建立表格

接下來,我們先建立一個表格。

with con: 
    con.execute(""" 
        CREATE TABLE USER ( 
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
            name TEXT, 
            age INTEGER 
        ); 
    """) 

在這個 USER 表中,我們添加了三列。正如我們所看到的,SQLite 確實是輕量級的,但是它支援常規 RDBMS 應該具有的所有基本特性,例如資料型別、可為null、主鍵和自動遞增。

執行這段程式碼之後,我們就已經建立好了一個表,儘管它什麼都沒有輸出。

3.插入記錄

讓我們在剛剛建立的 USER 表中插入資料記錄,這也可以證明我們確實建立了它。

如果我們需要一次性插入多個記錄,Python中的SQLite也能很容易地實現這一點。

sql = 'INSERT INTO USER (id, name, age) values(?, ?, ?)' 
data = [ 
    (1, 'Alice', 21), 
    (2, 'Bob', 22), 
    (3, 'Chris', 23) 
] 

我們需要用問號作為佔位符來定義SQL語句 。接下來就是建立一些要插入的示例資料。使用連線物件,就能插入這些示例行。

with con: 
    con.executemany(sql, data) 

在執行程式碼之後,沒有報錯,那就是成功的。

4.查詢表格

接下來,我們通過實際的方式來驗證我們所做的一切,通過查詢表格來獲取示例行。

with con: 
    data = con.execute("SELECT * FROM USER WHERE age <= 22") 
    for row in data: 
        print(row) 

你可以看到,很簡單就得到了結果。

此外,儘管 SQLite 是輕量級的,但是作為一個廣泛使用的資料庫,大多數SQL客戶端軟體都支援使用它。

我自己用得最多的是 DBeaver,接下來給大家介紹一下。

5.從SQL客戶端(DBeaver)連線到SQLite資料庫

因為我用的是 googlecolab,所以我要將 my-test.db 檔案下載到我的本地計算機上。當然,你也可以直接在你的電腦上使用 Python 資料庫連線你的本地資料庫。

在 DBeaver 中,建立一個新連線並選擇 SQLite 作為資料庫型別。

然後,瀏覽DB檔案。

現在你可以在資料庫上執行任何SQL查詢,看看它與其他常規關係資料庫有什麼不同。

與Pandas無縫連線

你以為就只有這些?不,事實上,作為Python的一個內建特性,SQLite 可以與 Pandas 資料幀無縫連線。

讓我們先來定義一個數據幀。

df_skill = pd.DataFrame({ 
    'user_id': [1,1,2,2,3,3,3], 
    'skill': ['Network Security', 'Algorithm Development', 'Network Security', 'Java', 'Python', 'Data Science', 'Machine Learning'] 
}) 

然後,我們可以簡單地呼叫資料幀的to_sql()方法將其儲存到資料庫中。

df_skill.to_sql('SKILL', con) 

就這樣我們甚至不需要預先建立表,列的資料型別和長度都會被推斷出來。當然,如果你想的話,你也可以先定義。

然後,假設我們要將表 USER 和 SKILL 連線在一起,並將結果讀入Pandas資料框。

df = pd.read_sql(''' 
    SELECT s.user_id, u.name, u.age, s.skill  
    FROM USER u LEFT JOIN SKILL s ON u.id = s.user_id 
''', con) 

是不是很厲害?讓我們把結果寫到一個名為USER_SKILL的新表中。

df.to_sql('USER_SKILL', con) 

我們也可以用SQL客戶端來檢索表。

總結

實際上,Python中還隱藏著很多驚喜。而且這些驚喜並不沒有隱藏起來,只是Python有太多現成可以直接使用的特性了,這就導致很多人無法發現這些特性。

在本文中,我介紹瞭如何使用 Python 內建庫 sqlite3 在 SQLite 資料庫中建立和操作表。它也支援對錶格進行更新和刪除操作,建議大家在看完這篇文章之後自己嘗試一下。

最重要的是,我們可以輕鬆地將表從 SQLite 資料庫讀入 Pandas 資料幀,反之亦然。這使我們能夠更容易地與我們的輕量級關係資料庫進行互動。

你可能會注意到 SQLite 沒有進行身份驗證,這也是它刻意設計的行為,因為需要輕量化。

一起去探索Python中更多令人驚訝的特性吧!

原文連結:https://developer.51cto.com/art/202007/622645.htm#topx
作者:為AI吶喊 更多文章和資料|點選下方文字直達 ↓↓↓ 阿里雲K8s實戰手冊 [阿里雲CDN排坑指南]CDN ECS運維指南 DevOps實踐手冊 Hadoop大資料實戰手冊 Knative雲原生應用開發指南 OSS 運維實戰手冊