Python3進階篇——sqlite3基礎使用

我們在前面已經學習了怎麼爬取我們想要的數據,並且對數據用csv進行了存儲,但是這種存儲方式對後續的數據處理比較麻煩;接下來學習一種嵌入式數據庫——sqlite3,它是一種自給自足、無服務器、零配置、事務性的 SQL 數據庫引擎,它本身使用C語言寫的,體積很小,可以被嵌入到很多應用中,甚至很多APP都使用sqlite對數據進行存儲。

在我們的Python3中,已經內置了sqlite3,所以不用我們在另外安裝;在講解sqlite之前,先來認識一下什麼是數據庫:
相信大家都使用過Excel表格,我們在使用Excel的時候裏面都有什麼東西:

  1. 首先他是一個文檔
    這個文檔裏面存放了很多東西,我們將它的後綴改成 .zip,就是壓縮文件格式,再把它打開,我們看下里面有什麼:

    我們發現裏面不僅有我們存入的數據,還有像.xml這樣表示前端的文件,一個Excel文件保存的數據是非常多的;再舉個栗子,我們有時候會對Excel文檔進行加密,要是密碼忘記了,就可以通過這裏刪除密碼;
  2. 我們打開Excel文檔,看看裏面有什麼:

    我們打開文檔之後,看到的是一張數據表,中間的就是數據表的內容,可以創建多張表,每張表格可以命名可以表示文檔的名字;我們可以在第一行鍵入數據的說明,然後在第二行還是鍵入數據,這樣就構成了一張我們簡單的數據表:
  3. 我們不僅能夠保存數據,還可以通過excel對數據進行查找和處理,比如計算語文成績的平均分、對多門成績進行排名、搜索小明的信息等等:
  4. 這是單張表格的操作,我們還可以對同個文檔的多個數據表進行數據交互,甚至多個文檔的多個數據表進行交互:
  5. 那麼既然數數據,那肯定就有數據類型,有不同的功能:

ok,那麼相信通過Excel文檔,大家對數據表有了一個簡單的瞭解,那麼數據庫就像這個excel文檔一樣,它首先是一個文件,裏面保存了我們需要存儲的數據,但是它的體積很小,沒有.xml這些前端的數據;他的組織也是以數據表爲單位,每張表格都會定義關鍵字段,就像學校、年級這些;通過找到指定的表格,指定的字段,通過插入、搜索、刪除等操作,對數據進行處理;通過外鍵可以和其他的數據表之間數據互通,減少數據的冗餘(就是說重複的數據)。我們暫且可以把數據庫理解成excel,但是數據庫更簡潔、更高效;

下面我們來看一下,怎麼來創建一個數據庫:

import sqlite3    # 導入庫,這個是python自帶的,不需要我們安裝

conn = sqlite3.connect('test1.db')    # 連接數據庫,如果路徑下沒有,則創建數據庫再打開

conn.close()    # 關閉數據庫

我們在上面說了,既然是數據庫,那麼肯定就有數據表和每張數據表的關鍵字段,這個就是我們後面數據的添加、處理、刪除的依據:

import sqlite3

conn = sqlite3.connect('test1.db')
cursor = conn.cursor()    # 創建一個遊標,我們可以把數據庫想象成一個工廠,遊標就是在工廠工作的工人
                          # 對數據表的任何操作都可以讓工人去做,通過遊標來實現
# 接下來就是需要執行命令了
cursor.execute('''CREATE TABLE TABLE1            # CREATE TABLE 表名    創建一張數據表
                # 下面就是數據表的關鍵字段,就是說數據表包含哪些信息
                # 字段名 數據類型 [其他設置]
                (ID INT PRIMARY KEY NOT NULL,
                NAME TEXT NOT NULL,
                AGE INT NOT NULL,
                ADDRESS CHAR(50));''')

conn.commit()    # 提交事務,就相當於提交工作,保存之前的操作
conn.close()     # 關閉數據庫連接

我們先來看一下execute()方法,它就是用來執行sql語句的的,裏面的參數就是一個字符串,這個字符串就是sql語句;
創建數據表語句:CREATE TABLE 表名(字段名 數據類型)
字段名我們不用講了,就相當於變量名,指明數據時有什麼含義
數據類型:在sqlite裏面,有五種數據的存儲類:

存儲類 說明
NULL 空值,沒有保存數據

INTEGER

帶符號的整數,會根據數值大小分配1、2、3、4、6或8字節的存儲空間
REAL 浮點數(分配8個字節的存儲空間)
TEXT 文本字符串
BLOB 二進制文件的容器,可以將二進制圖片等存儲在這裏
沒有布爾類型 在這裏表示邏輯值可用0或1代替
也沒有日期類型 有三種存儲方式,我這邊還是以文本存儲“YYYY-MM-DD HH:MM:SS.SSS”,分別對應年月日時分秒

但是SQLite支持列的親和類型,就像攀親戚,可以使用CHAR(n),定義定長字符串,這也是符合要求的,這邊不做贅述,可以看菜鳥教程的SQLite數據類型相關內容瞭解;
下面把常見的幾種親和數據類型用法總結下,後續不斷補充:

數據類型 說明
VARCHAR(n) 長度不固定,但是最大長度爲n的字符串,最大長度不可超過4000
CHAR(n) 長度固定爲n的字符串,最大長度不可超過254

PRIMARY KEY:主鍵,首先主鍵不是數據表的必選項,但是爲了數據的完整性、冗餘性方面考慮,主鍵是必要的,主鍵有着唯一性和非空性的特性,什麼意思?

我們以上面基本信息表的栗子來說明:

  1. 如果沒有主鍵的話,只要符合數據類型,都可以添加進去,那麼就有一種情況,同一個人的信息添加了兩遍,這個添加沒有任何錯誤,但是重複的數據就增加了數據的冗餘性,確保每一條數據起碼有信息是不一樣的;
  2. 那麼怎麼找主鍵的關鍵字呢?那麼就要看這個字段的唯一性,就是說這個字段不會出現公用的情況——上面的栗子,“學校”肯定不行,一個學校得有多少學生哈;“班級”也不行,一個班人也很多;“學號”貌似可以,一個班每個學生的學號是不肯能重複的;“姓名”可能會重名啊;其他的就不一一舉例了。那麼在這裏,學號是我們最好的主鍵字段,當然上面的學號非常簡單,正規的應該班級+序號,或者入學年份+班級+序號。

還有一個外鍵,這個就是用來對兩張數據表建立聯繫的,這裏先不講,後面再說;

NOT NULL:其實也非常簡單,字面意思就是非空,表明這個字段不能爲空;

 

好了,現在我們的數據表已經建好了(注意,當我們數據表建好之後,不能再創建同名的表,也就是說CREATE TABLE 表名 只能執行一次,如果想添加或刪除字段,那麼可以用ALTER語句實現,這個也是後面再講)接下來我們就要插入數據了:

import sqlite3

conn = sqlite3.connect('test1.db')
cursor = conn.cursor()

cursor.execute('INSERT INTO TABLE1 VALUES (2,"TEST",13,"HEN")')

conn.commit()
conn.close()

INSERT INTO 表名 [字段名] VALUES (值):是往數據表中插入值的SQL語句,字段名可以省略,但是後面的值就要與表中所有的字段一一對應,如果只是想插入表中的若干字段,那麼可以指明字段名,然後設置值;

我們已經將一條字段信息添加到數據庫裏面去了,我們可以安裝SQLite打開文件,但是這比較麻煩,我們可以用SQLiteSpy查看我們的數據庫(雲盤鏈接已附上,提取碼:lcmw)

接下來我們我們多添加幾條信息進去,來看看查詢語句怎麼使用:

import sqlite3

conn = sqlite3.connect('test1.db')
cursor = conn.cursor()

# data = cursor.execute('SELECT ID,NAME,AGE,ADDRESS FROM TABLE1')
# 兩種寫法的效果是一樣的,上面選擇提取的字段,下面則表示所有的字段
data = cursor.execute('SELECT * FROM TABLE1')
print(list(data))

conn.commit()
conn.close()

# 輸出結果:
# [(2, 'TEST', 13, 'HEN'), (1, 'TEST1', 13, 'HEN1'), (3, 'TEST3', 3, 'HEN3'), (4, 'TEST4', 4, 'HEN4'), (5, 'TEST5', 5, 'HEN5'), (6, 'TEST6', 6, 'HEN6'), (7, 'TEST7', 7, 'HEN7'), (8, 'TEST8', 8, 'HEN8'), (9, 'TEST9', 9, 'HEN9'), (10, 'TEST10', 10, 'HEN10'), (11, 'TEST11', 11, 'HEN11'), (12, 'TEST12', 12, 'HEN12'), (13, 'TEST13', 13, 'HEN13'), (14, 'TEST14', 14, 'HEN14'), (15, 'TEST15', 15, 'HEN15'), (16, 'TEST16', 16, 'HEN16'), (17, 'TEST17', 17, 'HEN17'), (18, 'TEST18', 18, 'HEN18'), (19, 'TEST19', 19, 'HEN19')]

SELECT 字段名 FROM 表名:這個就是查找語句,會把所有符合要求的字段都返回,注意:結果是以元組的形式返回的;
那麼這只是把特定的字段選擇提取出來了而已,有時候我需要指定條件,比如AGE<10的學生信息顯示出來,那麼需要怎麼處理呢?

import sqlite3

conn = sqlite3.connect('test1.db')
cursor = conn.cursor()

data = cursor.execute('SELECT * FROM TABLE1 WHERE AGE<10')
print(list(data))

conn.commit()
conn.close()

# 輸出結果:
# [(3, 'TEST3', 3, 'HEN3'), (4, 'TEST4', 4, 'HEN4'), (5, 'TEST5', 5, 'HEN5'), (6, 'TEST6', 6, 'HEN6'), (7, 'TEST7', 7, 'HEN7'), (8, 'TEST8', 8, 'HEN8'), (9, 'TEST9', 9, 'HEN9')]

這時候我們就可以用WHERE子句,來限制我們的條件:SELECT 字段名 FROM 表名 WHERE 條件表達式

data = cursor.execute('SELECT * FROM TABLE1 WHERE AGE<10 AND ID<5')    # 取兩個條件的交集
data = cursor.execute('SELECT * FROM TABLE1 WHERE AGE=13 OR ID<10')    # 取兩個條件的並集
data = cursor.execute('SELECT * FROM TABLE1 WHERE NOT(AGE=13)')        # 條件置反,即除了……

如果我們想修改某個字段的值,那麼我們可以用UPDATE語句進行字段的修改:
UPDATE 表名 SET 字段名=值 WHERE 表達式,如果想把所有的AGE都改爲14,那麼不用設置條件就好了;

import sqlite3

conn = sqlite3.connect('test1.db')
cursor = conn.cursor()

# 接下來會將所有AGE值爲13的信息改爲AGE=14
data = cursor.execute('SELECT * FROM TABLE1 WHERE AGE=13')
print(list(data))
cursor.execute('UPDATE TABLE1 SET AGE=14 WHERE AGE=13')
data = cursor.execute('SELECT * FROM TABLE1 WHERE AGE=14')

conn.commit()
conn.close()

# 輸出結果:
# [(2, 'TEST', 13, 'HEN'), (1, 'TEST1', 13, 'HEN1'), (13, 'TEST13', 13, 'HEN13'), (14, 'TEST14', 13, 'HEN14')]
# [(2, 'TEST', 14, 'HEN'), (1, 'TEST1', 14, 'HEN1'), (13, 'TEST13', 14, 'HEN13'), (14, 'TEST14', 14, 'HEN14')]

還有一種情況,比如說學號爲13的學生退學了,那麼就需要刪除他的信息,那麼怎麼刪除呢?
DELETE FROM 表名 WHERE 條件表達式(注意:不要忘記條件,不然所有的數據就都會被清空,那就真的是刪庫跑路了)

import sqlite3

conn = sqlite3.connect('test1.db')
cursor = conn.cursor()

cursor.execute('DELETE FROM TABLE1 WHERE ID=13')
data = cursor.execute('SELECT * FROM TABLE1 WHERE ID>10 AND ID < 15')
print(list(data))

conn.commit()
conn.close()

# 輸出結果:
# [(11, 'TEST11', 11, 'HEN11'), (12, 'TEST12', 12, 'HEN12'), (14, 'TEST14', 14, 'HEN14')]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章