[Python]_[初級]_[校驗查詢sqlite3資料庫]

infoworld發表於2020-11-30

場景

  1. sqlite3資料庫是我們開發程式時常用來儲存資料的資料庫,如果釋出產品時我們需要一些初始化資料才能正常執行產品,那麼這個資料庫測試組如何進行校驗是否正確呢?

說明

  1. sqlite3的提供了C語言的動態庫進行操作,但是測試組並不都會使用C語言開發測試程式的,而且使用C開發的程式還需要進行編譯連結執行,比較慢,這會影響測試編寫測試指令碼的效率。

  2. 測試一般使用是Python作為自動化測試語言,Python3其實也整合了sqlite3庫作為標準模組進行了釋出,我們可以直接使用import sqlite3就可以引用釋出,並通過參考Python sqlite3 API進行操作。

  3. 吐槽下PythonAPI還是看不習慣,應該說不夠標準。類似於JavaC/C++的都對每個引數進行解析,之後還對返回值進行說明,比如以下的看就比較明確。Python的卻是分段落,每個段落要仔細看內容才能知道講的什麼引數或返回值,有時候返回值並不是最後一行說明,可能穿插在某一個段落裡,不小心就錯過了。這是我不喜歡用Python的原因之一,看API十分費勁。

para1: xxx
para2: xxx

return: xxx

例子

  1. 以下例子通過開啟資料庫並統計所有表的行數來確認資料庫是否有損壞。當然如果知道校驗規則,也可以對資料進行檢查。
import sqlite3
from sqlite3.dbapi2 import OperationalError
import sys

# SQLite natively supports only the types TEXT, INTEGER, REAL, 
# BLOB and NULL
def checkDb(dbPath):
    # 'file:path/to/database?mode=ro'
    con = None
    try:
        con = sqlite3.connect('file:'+dbPath+'?mode=ro', uri=True)
    except OperationalError as identifier:
        print("Db Path Invalid %s" % (dbPath))
        return
   
    cur = con.cursor()

    sqlTables = "SELECT name FROM sqlite_master where type='table'"
    # 1. 使用Row物件,逐行獲取.
    print("============================")
    cur.execute(sqlTables)
    oneRow = cur.fetchone()
    array1 = []
    while(oneRow != None):
        print(oneRow[0])
        array1.append(oneRow[0])
        oneRow = cur.fetchone()

    print("============================")
    # 2. 一次過獲取所有行.
    cur.execute(sqlTables)
    for one in cur.fetchall():
        print(one[0])

    print("============================")
    # 3. 統計每個表的行數.
    for one in array1:
        t = (one,)
        cur.execute("SELECT COUNT(1) FROM "+one)
        print("%s(%d) " % (one,cur.fetchone()[0]))
    
    cur.close()

if __name__ == "__main__":
    checkDb(sys.argv[1])
    pass

輸出

執行方式: DbChecker.py xxx.db

============================
contact
sms
photo
video
music
book
app
info
============================
contact
sms
photo
video
music
book
app
info
============================
contact(1)
sms(1)
photo(0)
video(0)
music(0)
book(0)
app(0)
info(1)

參考

SQLite URI documentation

Python sqlite3 API

相關文章