python3使用sqlite3構建本地持久化快取

2023-11-07 06:01:09

環境:Windows 10_x64

python版本:3.9.2

sqlite3版本:3.34.0

日常python開發中會遇到資料持久化的問題,今天記錄下如何使用sqlite3進行資料持久化,並提供範例程式碼及資料檢視工具。

一、背景描述

python應用程式在執行過程中被kill掉(比如版本升級等情況),記憶體中的執行資料將會丟失,如果能夠準實時將資料儲存在快取中,程式下次啟動時將繼續執行被kill之前的動作。

使用資料庫作為持久化是筆記理想的選擇,可現實情況可能需要python指令碼進行本地持久化,相較於pickle等方式,sqlite3的持久化方式可延伸性比較強,方便後續遷移到mysql等資料庫。

二、具體實現

1、基礎使用範例

  • 檢視版本資訊

import sqlite3
print(sqlite3.version_info) #顯示sqlite3版本資訊
print(sqlite3.sqlite_version) #顯示SQLite版本資訊
  • 資料庫建立或連線

conn = sqlite3.connect("test1.db")
cur = conn.cursor()
  • 資料表建立

dbCreate = '''
CREATE TABLE user(
    user_id int,
    user_name text,
    password text
)
'''
cur.executescript(dbCreate)
conn.commit()
  • 插入資料

conn.execute("INSERT INTO user (user_id,user_name,password) VALUES(1,'user1','123456')")
conn.commit()
  • 查詢資料

cursor = conn.execute("SELECT * FROM user")
for row in cursor.fetchall():
    print(row)

完整範例程式碼如下:

#! /usr/bin/env python3
#--*-- ebcoding:utf-8 --*--

import sqlite3

dbCreate = '''
CREATE TABLE user(
    user_id int,
    user_name text,
    password text
)
'''

# 建立或連線資料庫
conn = sqlite3.connect("test1.db")
cur = conn.cursor()

cur.executescript(dbCreate)
conn.commit()

conn.execute("INSERT INTO user (user_id,user_name,password) VALUES(1,'user1','123456')")
conn.execute("INSERT INTO user (user_id,user_name,password) VALUES(2,'user2','123457')")
conn.commit()

cursor = conn.execute("SELECT * FROM user")
for row in cursor.fetchall():
    print(row)

conn.close()

執行效果:

生成的 test1.db 資料庫檔案可以使用 sqlitestudio 進行檢視,軟體執行效果如下:

 

下載地址:

https://sqlitestudio.pl/

如果下載過慢,可從如下文末提供的渠道獲取。

2、程式碼封裝範例

實際使用過程中,需要進行程式碼封裝,以便後續使用,這裡以通話記錄為例演示下封裝過程。

1)定義全域性快取 gDCdrData,用於在記憶體中存放資料;
2)定義全域性佇列 gQCDR ,用於資料傳遞;
3)定義sqlite3持久化檔案,並定義保留時長;
4)建立 ObjCdrItem 類,用於定義item資料結構;
5)定義sqlite3管理類 ObjCDRMgr,用於管理sqlite3資料庫;
6)啟動 dataGenThrd 執行緒模擬資料建立;
7)啟動 updateThrd 執行緒用於資料更新;
8)啟動 cleanThrd 執行緒用於資料清理;

範例程式碼如下:

 完整程式碼可從如下渠道獲取:

關注微信公眾號(聊聊博文,文末可掃碼)後回覆 20231106 獲取。

執行效果如下:

 資料檔案開啟效果如下:

三、資源下載

本文涉及檔案和範例程式碼從如下途徑獲取:

關注微信公眾號(聊聊博文,文末可掃碼)後回覆 20231106 獲取。

 好,就這麼多了,希望對你有幫助。