使用Python連接SQLite數(shù)據(jù)庫(kù)的操作步驟
SQLite是一種輕量級(jí)的嵌入式數(shù)據(jù)庫(kù),廣泛應(yīng)用于各種應(yīng)用程序中。
Python提供了內(nèi)置的sqlite3模塊,使得連接和操作SQLite數(shù)據(jù)庫(kù)變得非常簡(jiǎn)單。
下面我將詳細(xì)介紹如何使用sqlite3模塊來(lái)連接SQLite數(shù)據(jù)庫(kù),并提供一些實(shí)際開(kāi)發(fā)中的建議和注意事項(xiàng)。
1. 使用 sqlite3 連接SQLite數(shù)據(jù)庫(kù)
sqlite3 是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,無(wú)需額外安裝即可使用。
連接數(shù)據(jù)庫(kù)
下面是一個(gè)簡(jiǎn)單的示例,展示如何連接到SQLite數(shù)據(jù)庫(kù):
import sqlite3 # 創(chuàng)建數(shù)據(jù)庫(kù)連接 conn = sqlite3.connect('example.db') # 創(chuàng)建游標(biāo)對(duì)象 cur = conn.cursor() # 創(chuàng)建表 cur.execute('''CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL)''') # 插入數(shù)據(jù) cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Alice', 'alice@example.com')) cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Bob', 'bob@example.com')) # 提交事務(wù) conn.commit() # 查詢數(shù)據(jù) cur.execute("SELECT * FROM users") rows = cur.fetchall() for row in rows: print(row) # 關(guān)閉游標(biāo)和連接 cur.close() conn.close()
注意事項(xiàng)
- 錯(cuò)誤處理:在實(shí)際開(kāi)發(fā)中,應(yīng)該添加錯(cuò)誤處理機(jī)制,以防止數(shù)據(jù)庫(kù)操作失敗或其他異常情況。
import sqlite3 try: conn = sqlite3.connect('example.db') cur = conn.cursor() cur.execute('''CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL)''') cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Alice', 'alice@example.com')) cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Bob', 'bob@example.com')) conn.commit() cur.execute("SELECT * FROM users") rows = cur.fetchall() for row in rows: print(row) except sqlite3.Error as e: print(f"Error: {e}") finally: if cur: cur.close() if conn: conn.close()
- 上下文管理器:為了確保資源被正確釋放,可以使用上下文管理器(
with
語(yǔ)句)來(lái)管理數(shù)據(jù)庫(kù)連接和游標(biāo)。
import sqlite3 try: with sqlite3.connect('example.db') as conn: with conn.cursor() as cur: cur.execute('''CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL)''') cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Alice', 'alice@example.com')) cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Bob', 'bob@example.com')) conn.commit() cur.execute("SELECT * FROM users") rows = cur.fetchall() for row in rows: print(row) except sqlite3.Error as e: print(f"Error: {e}")
2. 使用參數(shù)化查詢
為了避免SQL注入攻擊,應(yīng)該使用參數(shù)化查詢。
import sqlite3 try: with sqlite3.connect('example.db') as conn: with conn.cursor() as cur: cur.execute('''CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL)''') cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Alice', 'alice@example.com')) cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Bob', 'bob@example.com')) conn.commit() cur.execute("SELECT * FROM users WHERE name = ?", ('Alice',)) rows = cur.fetchall() for row in rows: print(row) except sqlite3.Error as e: print(f"Error: {e}")
3. 使用事務(wù)
SQLite支持事務(wù)操作,可以通過(guò)事務(wù)來(lái)確保數(shù)據(jù)的一致性和完整性。
import sqlite3 try: with sqlite3.connect('example.db') as conn: with conn.cursor() as cur: cur.execute('''CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL)''') conn.execute("BEGIN TRANSACTION") try: cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Alice', 'alice@example.com')) cur.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Bob', 'bob@example.com')) conn.commit() except sqlite3.Error as e: conn.rollback() print(f"Error: {e}") cur.execute("SELECT * FROM users") rows = cur.fetchall() for row in rows: print(row) except sqlite3.Error as e: print(f"Error: {e}")
實(shí)際開(kāi)發(fā)中的建議
- 錯(cuò)誤處理:始終添加錯(cuò)誤處理機(jī)制,以確保在數(shù)據(jù)庫(kù)操作失敗時(shí)能夠捕獲并處理異常。
- 資源管理:使用上下文管理器來(lái)管理數(shù)據(jù)庫(kù)連接和游標(biāo),確保資源被正確釋放。
- 參數(shù)化查詢:使用參數(shù)化查詢來(lái)防止SQL注入攻擊,確保數(shù)據(jù)庫(kù)操作的安全性。
- 事務(wù)管理:合理使用事務(wù)來(lái)確保數(shù)據(jù)的一致性和完整性。
- 日志記錄:在生產(chǎn)環(huán)境中,添加日志記錄機(jī)制,以便在出現(xiàn)問(wèn)題時(shí)能夠追蹤和調(diào)試。
在Python中連接SQLite數(shù)據(jù)庫(kù),sqlite3
模塊提供了一個(gè)簡(jiǎn)單且強(qiáng)大的接口。通過(guò)合理使用上下文管理器、參數(shù)化查詢和事務(wù)管理,可以提高代碼的健壯性和性能,確保數(shù)據(jù)庫(kù)操作的安全性和可靠性。在實(shí)際開(kāi)發(fā)中,應(yīng)該注意錯(cuò)誤處理、資源管理和日志記錄,以確保系統(tǒng)的穩(wěn)定性和可維護(hù)性。
通過(guò)這些方法和技巧,你可以有效地連接和管理SQLite數(shù)據(jù)庫(kù),滿足各種復(fù)雜的需求。
拓展:Python操作SQLite數(shù)據(jù)庫(kù)
創(chuàng)建SQLite數(shù)據(jù)庫(kù)
在IDE或文本編輯器中創(chuàng)建一個(gè)新的Python文件,把此文件命名為python\_database.py
首先,將SQLite模塊導(dǎo)入到我們的項(xiàng)目中:
import sqlite3
由于Python內(nèi)置了SQLite3,不需要安裝任何東西。接下來(lái),需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)和與文件的連接。
db = sqlite3.connect('db.sqlite3')
cursor = db.cursor()
上面的代碼分配了兩個(gè)變量,第一個(gè)變量db調(diào)用了sqlite3.connect,它會(huì)連接到文件,這里在括號(hào)內(nèi)告訴Python我們想要命名數(shù)據(jù)庫(kù)。
cursor變量設(shè)置為db.cursor(),Python使用它來(lái)讀取和寫(xiě)入數(shù)據(jù)庫(kù)文件表。
然后需要實(shí)際創(chuàng)建表,可以通過(guò)以下代碼來(lái)完成:
cursor.execute(''' CREATE TABLE IF NOT EXISTS contacts( id INTEGER PRIMARY KEY, firstName TEXT, lastName TEXT, age TEXT, address TEXT, jobTitle TEXT)''') db.commit()
解釋一下上面的代碼:
調(diào)用cursor.execute
來(lái)在db.sqlite3
數(shù)據(jù)庫(kù)文件中寫(xiě)入一個(gè)新表。創(chuàng)建的表名為contacts
,CREATE TABLE IF NOT EXISTS
行創(chuàng)建表(如果它還不存在于你的Python文件目錄中)。
下面幾行分配表頭名稱(chēng)給每列,還必須指定每列中將放入什么類(lèi)型的數(shù)據(jù)。
下面列出了不同的數(shù)據(jù)類(lèi)型:
NULL
,該值是個(gè)NULL值。INTEGER
,該值是個(gè)有符號(hào)整數(shù),根據(jù)值的大小,以1、2、3、4、6或8個(gè)字節(jié)的形式存儲(chǔ)。REAL
,該值是個(gè)浮點(diǎn)值,存儲(chǔ)為8個(gè)字節(jié)的IEEE浮點(diǎn)數(shù)。TEXT
,該值是個(gè)文本字符串,使用數(shù)據(jù)庫(kù)編碼(UTF-8、UTF-16BE或UTF-16LE)存儲(chǔ)。BLOB
,該值是數(shù)據(jù)的二進(jìn)制大對(duì)象,以原始形式存儲(chǔ)。
有一個(gè)名為id
的列,為其分配了INTEGER PRIMARY KEY
值。這對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō)是必需的,以便為每個(gè)條目分配唯一的ID,SQLite會(huì)自動(dòng)增加每個(gè)新條目,每次添加新條目時(shí)SQLite都會(huì)自動(dòng)將每個(gè)條目遞增1。(在創(chuàng)建其他表之間的關(guān)系時(shí),也需要使用此功能)。
創(chuàng)建的下一組標(biāo)題包括firstName
、lastName
、age
、address
和jobTitle,
由此構(gòu)建一個(gè)簡(jiǎn)單的聯(lián)系人數(shù)據(jù)庫(kù),調(diào)用db.commit()
將表提交到數(shù)據(jù)庫(kù)文件中。
現(xiàn)在向新表中輸入一些假數(shù)據(jù),可以編寫(xiě)一些 SQL 代碼,如下所示:
cursor.execute('''INSERT INTO contacts(firstName, lastName, age, address, jobTitle) VALUES (?, ?, ?, ?, ?)''', ('Grant', 'Peach', '35', '1 Smith Street', 'Software Dev'))
db.commit()
如果運(yùn)行上面的代碼,Python將執(zhí)行SQL并把條目插入到表中正確的標(biāo)題中。
為了使它變得稍微簡(jiǎn)單一些,下面畫(huà)了一個(gè)圖表,說(shuō)明了它是如何工作的:
每個(gè)?
都是一個(gè)占位符,用于向標(biāo)題輸入條目,因此也可以使用變量來(lái)輸入數(shù)據(jù),例如來(lái)自用戶輸入等。
SQLite數(shù)據(jù)庫(kù)閱讀器
如果想知道數(shù)據(jù)是否輸入到數(shù)據(jù)庫(kù)中,可以通過(guò)多種方式檢查這一點(diǎn),但是需要一些其他軟件來(lái)完成這個(gè)操作,這取決于操作系統(tǒng)甚至IDE可以使用什么來(lái)完成這個(gè)操作。
MacOS SQLite數(shù)據(jù)庫(kù)閱讀器
Base(£19.99或通過(guò)SetApp獲得)
適用于 SQLite 的 DB 瀏覽器(免費(fèi))
Windows SQLite數(shù)據(jù)庫(kù)閱讀器
適用于 SQLite 的 DB 瀏覽器(免費(fèi))
SQLite閱讀器(升級(jí)需要費(fèi)用)
Linux SQLite數(shù)據(jù)庫(kù)閱讀器
適用于 SQLite 的 DB 瀏覽器(免費(fèi))
安裝其中一個(gè)閱讀器,并加載數(shù)據(jù)庫(kù)文件,應(yīng)該會(huì)看到類(lèi)似于下面屏幕截圖的GUI:
并且能夠看到創(chuàng)建的表以及所有的標(biāo)題,如果單擊瀏覽數(shù)據(jù)選項(xiàng)卡,就會(huì)看到表格中包含通過(guò)代碼分配給每個(gè)標(biāo)題的內(nèi)容,如下所示:
DB Browser是編輯數(shù)據(jù)以及通過(guò)CSV文件加載大量數(shù)據(jù)的真正有用工具,也可以在具有專(zhuān)業(yè)版的Pycharm IDE中執(zhí)行此操作。
查找數(shù)據(jù)
現(xiàn)在已經(jīng)知道如何輸入數(shù)據(jù)以及查看它是否實(shí)際位于我們的數(shù)據(jù)庫(kù)中,來(lái)返回到代碼并創(chuàng)建一個(gè)函數(shù),可以搜索數(shù)據(jù)庫(kù)并顯示輸出。
刪除代碼中的數(shù)據(jù)輸入部分,因?yàn)槲覀儾辉傩枰ɑ蛘咧苯幼⑨專(zhuān)瑯?gòu)建搜索函數(shù),此函數(shù)將搜索任何給定的第一個(gè)名字并返回該行數(shù)據(jù)。
def search_db(first_name): cursor.execute("SELECT * FROM contacts WHERE firstName LIKE '%' || ? || '%'", (first_name,)) results = cursor.fetchall() print('Results Found...\n') print(results) search_db('Grant')
運(yùn)行上面的代碼會(huì)輸出以下內(nèi)容:
解釋一下代碼:
cursor.execute("SELECT * FROM contacts WHERE firstName LIKE '%' || ? || '%'", (first_name,))
上面的代碼從 contacts
表中選擇所有內(nèi)容,其中 firstName
列中包含搜索到的首字母。然后創(chuàng)建了一個(gè)叫做results
的變量,通過(guò) cursor.fetchall()
將結(jié)果分配給該變量,然后在終端中打印出結(jié)果。
以上就是使用Python連接SQLite數(shù)據(jù)庫(kù)的操作步驟的詳細(xì)內(nèi)容,更多關(guān)于Python連接SQLite的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python中如何使用sqlite3操作SQLite數(shù)據(jù)庫(kù)詳解
- 通過(guò)python封裝SQLite3的示例代碼
- Python數(shù)據(jù)庫(kù)編程之SQLite和MySQL的實(shí)踐指南
- Python的sqlite3模塊中常用函數(shù)
- Python中SQLite數(shù)據(jù)庫(kù)的使用
- Python數(shù)據(jù)庫(kù)sqlite3圖文實(shí)例詳解
- Python使用sqlite3第三方庫(kù)讀寫(xiě)SQLite數(shù)據(jù)庫(kù)的方法步驟
- Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù)
- python處理SQLite數(shù)據(jù)庫(kù)的方法
- SQLite5-使用Python來(lái)讀寫(xiě)數(shù)據(jù)庫(kù)
- Pandas使用SQLite3實(shí)戰(zhàn)
相關(guān)文章
Python實(shí)現(xiàn)矩陣轉(zhuǎn)置的幾種方法詳解
這篇文章主要介紹了Python實(shí)現(xiàn)矩陣轉(zhuǎn)置的幾種方法詳解,zip() 函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的對(duì)象,這樣做的好處是節(jié)約了不少的內(nèi)存,需要的朋友可以參考下2023-08-08Python實(shí)現(xiàn)PDF頁(yè)面的刪除與添加功能
在處理PDF文檔的過(guò)程中,我們時(shí)常會(huì)需要對(duì)PDF文檔中的頁(yè)面進(jìn)行編輯操作的情況,如插入和刪除頁(yè)面,通過(guò)添加和刪除PDF頁(yè)面,我們可以增加內(nèi)容或?qū)Σ恍枰膬?nèi)容進(jìn)行刪除,本文將介紹如何使用Python代碼實(shí)現(xiàn)在PDF文檔中添加和刪除頁(yè)面2024-04-04用python寫(xiě)一個(gè)windows消息提醒小程序
上班時(shí),由于自己經(jīng)常coding到忘記時(shí)間,經(jīng)常會(huì)一坐坐很久,搞的勞資腰都不好了,所以沒(méi)事閑的寫(xiě)了個(gè)久坐提醒的小程序,文中有詳細(xì)的代碼示例,講解的非常詳細(xì),感興趣的朋友可以參考下2023-12-12新手入門(mén)Python編程的8個(gè)實(shí)用建議
這篇文章主要介紹了Python編程的8個(gè)實(shí)用建議,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python調(diào)用百度AI實(shí)現(xiàn)圖片上表格識(shí)別功能
這篇文章主要給大家介紹了關(guān)于Python調(diào)用百度AI實(shí)現(xiàn)圖片上表格識(shí)別功能的相關(guān)資料,在Python環(huán)境下,利用百度AI開(kāi)放平臺(tái)文字識(shí)別技術(shù),對(duì)表格類(lèi)圖片進(jìn)行識(shí)別,需要的朋友可以參考下2021-09-09Python numpy有哪些常用數(shù)據(jù)類(lèi)型
Numpy提供了兩種基本的對(duì)象:ndarray(N-dimensional Array Object)和 ufunc(Universal Function Object)。ndarray是存儲(chǔ)單一數(shù)據(jù)類(lèi)型的多維數(shù)組,而ufunc則是能夠?qū)?shù)組進(jìn)行處理的函數(shù)2023-02-02PyQt轉(zhuǎn)換路徑中的斜杠(斜杠(/)與反斜杠(\)轉(zhuǎn)換)
本文主要介紹了PyQt轉(zhuǎn)換路徑中的斜杠(斜杠(/)與反斜杠(\)轉(zhuǎn)換),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Python利用wxPython制作一個(gè)有趣的驗(yàn)證碼生成器
這篇文章主要為大家詳細(xì)介紹了Python如何利用wxPython制作一個(gè)簡(jiǎn)單有趣的驗(yàn)證碼生成器,文中的示例代碼講解詳細(xì),需要的小伙伴可以了解一下2023-04-04