第77天:Python 操作 SQLite


by 程序員野客

1 簡介

SQLite 是一種輕型嵌入式關系型數據庫,它包含在一個相對小的 C 庫中。SQLite 占用資源低,處理速度快,它支持 Windows、Linux、Unix 等多種主流操作系統,支持 Python、Java、C# 等多種語言,目前的版本已經發展到了 SQLite3。

SQLite 是一個進程內的庫,它實現了自給自足、無服務器、無需配置、支持事務。Python 可以通過 sqlite3 模塊與 SQLite3 集成,Python 2.5.x 以上版本內置了 sqlite3 模塊,因此,我們在 Python 中可以直接使用 SQLite。

2 SQLite 數據類型

在介紹使用之前,我們先了解下 SQLite 數據類型。SQLite 采用動態數據類型,也就是說數據的類型取決於數據本身。

2.1 存儲類型

存儲類型就是數據保存成文件后的表現形式,存儲類型有 5 種,如下所示:

類型 描述
NULL 空值
INTEGER 有符號的整數類型
REAL 浮點數類型
TEXT 字符串,使用數據庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲
BLOB 二進制表示

2.2 親和類型

親和類型簡單來說就是數據表列的數據對應存儲類型的傾向性,當數據插入時,字段的數據將會優先采用親緣類型作為值的存儲方式,同樣有 5 種,如下所示:

類型 描述
NONE 不做任何轉換,直接以該數據所屬的數據類型進行存儲
NUMERIC 該列可以包含使用所有五個存儲類型的值
INTEGER 類似於 NUMERIC,區別是在執行 CAST 表達式時
TEXT 該列使用存儲類型 NULL、TEXT 或 BLOB 存儲數據
REAL 類似於 NUMERIC,區別是它會強制把整數值轉換為浮點類型

2.3 聲明類型

聲明類型也就是我們寫 SQL 時字段定義的類型,我們看一下常用的聲明類型與親和類型的對應關系。

聲明類型 親和類型
INT/INTEGER/TINYINT/BIGINT INTEGER
VARCHAR/TEXT/CLOB TEXT
BLOB NONE
DOUBLE/FLOAT REAL
DECIMAL/BOOLEAN/DATE/DATETIME NUMERIC

3 SQLite 常用函數

SQLite 提供了一些內置函數,也就是我們可以直接使用的函數,下面來看一下。

函數 描述
COUNT 計算一個數據庫表中的行數
MAX 某列的最大值
MIN 某列的最小值
AVG 某列的平均值
SUM 某列的和
RANDOM 返回一個介於 -9223372036854775808 和 +9223372036854775807 之間的隨機整數
ABS 返回數值參數的絕對值
UPPER 把字符串轉換為大寫字母
LOWER 把字符串轉換為小寫字母
LENGTH 返回字符串的長度
sqlite_version 返回 SQLite 庫的版本

使用示例如下所示:

SELECT COUNT(*) FROM table;
SELECT MAX/MIN/AVG/SUM/ABS/UPPER/LOWER/LENGTH(col) FROM table;
SELECT random() AS Random;
SELECT sqlite_version() AS 'SQLite Version';

4 基本使用

4.1 連接數據庫

# 導入模塊
import sqlite3
# 連接數據庫
conn = sqlite3.connect('test.db')

如果數據庫不存在,則會自動被創建。

4.2 游標

連接數據庫后,我們需要使用游標進行相應 SQL 操作,游標創建如下所示:

# 創建游標
cs = conn.cursor()

4.3 創建表

我們在 test.db 庫中新建一張表 student,如下所示:

# 創建表
cs.execute('''CREATE TABLE student
       (id varchar(20) PRIMARY KEY,
        name varchar(20));''')
# 關閉 Cursor
cs.close()
# 提交當前事務
conn.commit()
# 關閉連接
conn.close()

表創建好后,我們可以使用圖形化工具 SQLiteStudio 直觀的查看一下,官方下載地址: https://sqlitestudio.pl/index.rvt?act=download,打開如圖所示:

以 Windows 系統為例,選擇免安裝版 portable 進行下載,下載好后解壓文件,直接運行文件夾中的 SQLiteStudio.exe 即可,打開后如圖所示:

我們先點擊上方工具欄上的 Database 按鈕,然后選 Add a database,如圖所示:

接着點擊文件下方右側的綠色加號按鈕或文件夾按鈕,選擇數據庫文件,比如我們選擇 test.db 文件,選好了后點擊測試連接,如果能夠正常連接,我們就點擊 OK 按鈕添加數據庫。

添加完數據庫后,再點擊 SQLiteStudio 主界面上方工具欄中 View 按鈕,接着選數據庫,結果如圖所示:

接着雙擊 test 庫,結果如圖所示:

此時已經看到 student 表了,雙擊 student 表,我們還可以查看表的更多信息,如圖所示:

4.4 新增

我們向 student 表中插入兩條數據,如下所示:

cs.execute("INSERT INTO student (id, name) VALUES ('1', 'Jhon')")
cs.execute("INSERT INTO student (id, name) VALUES ('2', 'Alan')")
cs.execute("INSERT INTO student (id, name) VALUES ('3', 'Bob')")
cs.close()
conn.commit()
conn.close()

執行完后,到 SQLiteStudio 中看一下,如圖所示:

我們看到數據已經進來了。

4.5 查詢

前面我們是通過 SQLiteStudio 查看數據的,現在我們通過 SQL 查看一下,如下所示:

# 導入模塊
import sqlite3
# 連接數據庫
conn = sqlite3.connect('test.db')
# 創建游標
cs = conn.cursor()
# 查詢數據
cs.execute("SELECT id, name FROM student")
# 獲取查詢結果集中的下一行
print('fetchone-->', cs.fetchone())
# 獲取查詢結果集中的下一行組
print('fetchmany-->', cs.fetchmany())
# 獲取查詢結果集中所有(剩余)的行
print('fetchall-->', cs.fetchall())
cs.close()
conn.close()

輸出結果:

fetchone--> ('1', 'Jhon')
fetchmany--> [('2', 'Alan')]
fetchall--> [('3', 'Bob')]

4.6 更新

我們修改 id 為 1 這條數據的 name 值,如下所示:

# 導入模塊
import sqlite3
# 連接數據庫
conn = sqlite3.connect('test.db')
# 創建游標
cs = conn.cursor()
# 修改數據
cs.execute("SELECT id, name FROM student WHERE id = '1'")
print('修改前-->', cs.fetchall())
cs.execute("UPDATE student set name = 'Nicolas' WHERE id = '1'")
cs.execute("SELECT id, name FROM student WHERE id = '1'")
print('修改后-->', cs.fetchall())
conn.commit()
cs.close()
conn.close()

輸出結果:

修改前--> [('1', 'Jhon')]
修改后--> [('1', 'Nicolas')]

4.7 刪除

我們刪除 id 為 1 這條數據,如下所示:

# 導入模塊
import sqlite3
# 連接數據庫
conn = sqlite3.connect('test.db')
# 創建游標
cs = conn.cursor()
# 刪除
cs.execute("SELECT id, name FROM student")
print('刪除前-->', cs.fetchall())
cs.execute("DELETE FROM student WHERE id = '1'")
cs.execute("SELECT id, name FROM student")
print('刪除后-->', cs.fetchall())
conn.commit()
cs.close()
conn.close()

輸出結果:

刪除前--> [('2', 'Alan'), ('1', 'Jhon')]
刪除后--> [('2', 'Alan')]

這里我們只介紹了增刪改查基本操作,SQLite 的 SQL 操作與我們常用的 MySQL 等數據庫基本類似。

總結

本文介紹了 SQLite 及通過 Python 操作 SQLite,對 Python 工程師使用 SQLite 提供了基本支撐。

示例代碼:Python-100-days-day080

參考:

https://baike.baidu.com/item/SQLite/375020?fr=aladdin

https://www.liaoxuefeng.com/wiki/1016959663602400/1017801751919456

關注公眾號:python技術,回復"python"一起學習交流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM