新聞中心
如果你是軟件開發(fā)人員,相信你一定知道或者曾經(jīng)使用過一個非常輕量級的數(shù)據(jù)庫——SQLite。它具有作為關(guān)系數(shù)據(jù)庫所需的幾乎所有功能,但是這個數(shù)據(jù)庫把所有功能都保存在一個文件中。在其官方網(wǎng)站上,SQLite的主要應(yīng)用場景包括:

創(chuàng)新互聯(lián)成立于2013年,先為盤州等服務(wù)建站,盤州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為盤州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
- 嵌入式設(shè)備和物聯(lián)網(wǎng)
- 數(shù)據(jù)分析
- 數(shù)據(jù)傳輸
- 文件存檔或數(shù)據(jù)容器
- 內(nèi)部或臨時(shí)數(shù)據(jù)庫
- 在演示或測試期間替代企業(yè)數(shù)據(jù)庫
- 教育、培訓(xùn)和測試
- 實(shí)驗(yàn)性SQL語言擴(kuò)展
當(dāng)然,SQLite還有很多其他功能,在此不一一列舉,感興趣的同學(xué)可以去看官方文檔:https://www.sqlite.org/whentouse.html
最重要的是,SQLite實(shí)際上是作為Python庫內(nèi)置的。換言之,你不需要安裝任何服務(wù)器端/客戶端軟件,也不需要運(yùn)行某個服務(wù),只要你在Python中導(dǎo)入庫并開始編程,那么你就有了一個關(guān)系數(shù)據(jù)庫管理系統(tǒng)!
導(dǎo)入和使用
這里我們說“內(nèi)置”的意思就是,你甚至不需要運(yùn)行 pip install ,就能獲取庫。只需要通過以下方式導(dǎo)入:
- import sqlite3 as sl
1.創(chuàng)建與數(shù)據(jù)庫的連接
我們根本不需要為驅(qū)動程序、連接字符串等煩惱??梢灾苯觿?chuàng)建一個 SQLite 數(shù)據(jù)庫,并擁有一個簡單的連接對象:
- con = sl.connect('my-test.db')
運(yùn)行此行代碼后,我們就已經(jīng)創(chuàng)建并連接到該數(shù)據(jù)庫上。 如果要求Python連接的數(shù)據(jù)庫不存在,它就會自動幫我們創(chuàng)建一個空數(shù)據(jù)庫。 如果我們已經(jīng)創(chuàng)建了數(shù)據(jù)庫,就能用上面完全相同的代碼連接到現(xiàn)有數(shù)據(jù)庫。
2.創(chuàng)建表格
接下來,我們先創(chuàng)建一個表格。
- with con:
- con.execute("""
- CREATE TABLE USER (
- id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
- name TEXT,
- age INTEGER
- );
- """)
在這個 USER 表中,我們添加了三列。正如我們所看到的,SQLite 確實(shí)是輕量級的,但是它支持常規(guī) RDBMS 應(yīng)該具有的所有基本特性,例如數(shù)據(jù)類型、可為null、主鍵和自動遞增。
運(yùn)行這段代碼之后,我們就已經(jīng)創(chuàng)建好了一個表,盡管它什么都沒有輸出。
3.插入記錄
讓我們在剛剛創(chuàng)建的 USER 表中插入數(shù)據(jù)記錄,這也可以證明我們確實(shí)創(chuàng)建了它。
如果我們需要一次性插入多個記錄,Python中的SQLite也能很容易地實(shí)現(xiàn)這一點(diǎn)。
- sql = 'INSERT INTO USER (id, name, age) values(?, ?, ?)'
- data = [
- (1, 'Alice', 21),
- (2, 'Bob', 22),
- (3, 'Chris', 23)
- ]
我們需要用問號作為占位符來定義SQL語句 。接下來就是創(chuàng)建一些要插入的示例數(shù)據(jù)。使用連接對象,就能插入這些示例行。
- with con:
- con.executemany(sql, data)
在運(yùn)行代碼之后,沒有報(bào)錯,那就是成功的。
4.查詢表格
接下來,我們通過實(shí)際的方式來驗(yàn)證我們所做的一切,通過查詢表格來獲取示例行。
- with con:
- data = con.execute("SELECT * FROM USER WHERE age <= 22")
- for row in data:
- print(row)
你可以看到,很簡單就得到了結(jié)果。
此外,盡管 SQLite 是輕量級的,但是作為一個廣泛使用的數(shù)據(jù)庫,大多數(shù)SQL客戶端軟件都支持使用它。
我自己用得最多的是 DBeaver,接下來給大家介紹一下。
5.從SQL客戶端(DBeaver)連接到SQLite數(shù)據(jù)庫
因?yàn)槲矣玫氖?googlecolab,所以我要將 my-test.db 文件下載到我的本地計(jì)算機(jī)上。當(dāng)然,你也可以直接在你的電腦上使用 Python 數(shù)據(jù)庫連接你的本地?cái)?shù)據(jù)庫。
在 DBeaver 中,創(chuàng)建一個新連接并選擇 SQLite 作為數(shù)據(jù)庫類型。
然后,瀏覽DB文件。
現(xiàn)在你可以在數(shù)據(jù)庫上運(yùn)行任何SQL查詢,看看它與其他常規(guī)關(guān)系數(shù)據(jù)庫有什么不同。
與Pandas無縫連接
你以為就只有這些?不,事實(shí)上,作為Python的一個內(nèi)置特性,SQLite 可以與 Pandas 數(shù)據(jù)幀無縫連接。
讓我們先來定義一個數(shù)據(jù)幀。
- 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']
- })
然后,我們可以簡單地調(diào)用數(shù)據(jù)幀的to_sql()方法將其保存到數(shù)據(jù)庫中。
- df_skill.to_sql('SKILL', con)
就這樣我們甚至不需要預(yù)先創(chuàng)建表,列的數(shù)據(jù)類型和長度都會被推斷出來。當(dāng)然,如果你想的話,你也可以先定義。
然后,假設(shè)我們要將表 USER 和 SKILL 連接在一起,并將結(jié)果讀入Pandas數(shù)據(jù)框。
- 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)
是不是很厲害?讓我們把結(jié)果寫到一個名為USER_SKILL的新表中。
- df.to_sql('USER_SKILL', con)
我們也可以用SQL客戶端來檢索表。
總結(jié)
實(shí)際上,Python中還隱藏著很多驚喜。而且這些驚喜并不沒有隱藏起來,只是Python有太多現(xiàn)成可以直接使用的特性了,這就導(dǎo)致很多人無法發(fā)現(xiàn)這些特性。
在本文中,我介紹了如何使用 Python 內(nèi)置庫 sqlite3 在 SQLite 數(shù)據(jù)庫中創(chuàng)建和操作表。它也支持對表格進(jìn)行更新和刪除操作,建議大家在看完這篇文章之后自己嘗試一下。
最重要的是,我們可以輕松地將表從 SQLite 數(shù)據(jù)庫讀入 Pandas 數(shù)據(jù)幀,反之亦然。這使我們能夠更容易地與我們的輕量級關(guān)系數(shù)據(jù)庫進(jìn)行交互。
你可能會注意到 SQLite 沒有進(jìn)行身份驗(yàn)證,這也是它刻意設(shè)計(jì)的行為,因?yàn)樾枰p量化。
一起去探索Python中更多令人驚訝的特性吧!
本文標(biāo)題:你知道Python有內(nèi)置數(shù)據(jù)庫嗎?Python內(nèi)置庫SQlite3使用指南
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/dhsgcip.html


咨詢
建站咨詢
