python連接sqlite3簡單用法完整例子
1. 連接到數(shù)據(jù)庫
在 Python 中使用 sqlite3.connect() 方法連接到 SQLite 數(shù)據(jù)庫。如果數(shù)據(jù)庫文件不存在,會自動創(chuàng)建。
import sqlite3
# 連接到數(shù)據(jù)庫文件(如果不存在則自動創(chuàng)建)
conn = sqlite3.connect('example.db')- 解釋:
connect('example.db'):創(chuàng)建或打開名為example.db的數(shù)據(jù)庫文件。- 返回的
conn是數(shù)據(jù)庫連接對象,后續(xù)操作都需要通過它進行。
2. 創(chuàng)建游標(biāo)對象
通過連接對象創(chuàng)建游標(biāo)(Cursor),用于執(zhí)行 SQL 語句。
cursor = conn.cursor()
- 解釋:
- 游標(biāo)對象
cursor用于執(zhí)行create table、insert into、select等 SQL 語句。
- 游標(biāo)對象
3. 創(chuàng)建表
使用 create table 語句創(chuàng)建表,推薦使用 if not exists 避免重復(fù)創(chuàng)建。
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
)
''')
conn.commit()- 解釋:
create table if not exists users:如果表users不存在則創(chuàng)建。id integer primary key autoincrement:id是主鍵,自動遞增。name text not null:name字段為文本類型且不能為空。email text unique:email字段必須唯一。conn.commit():提交事務(wù)(必須執(zhí)行,否則表不會被創(chuàng)建)。
4. 插入數(shù)據(jù)
使用 insert into 插入數(shù)據(jù),推薦使用參數(shù)化查詢防止 SQL 注入。
# 單條插入
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
('Alice', 25, 'alice@example.com'))
# 多條插入
users_data = [
('Bob', 30, 'bob@example.com'),
('Charlie', 35, 'charlie@example.com')
]
cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", users_data)
conn.commit()- 解釋:
values (?, ?, ?):?是占位符,Python 會自動替換參數(shù)(防止 SQL 注入)。executemany可一次插入多條數(shù)據(jù)。conn.commit()提交事務(wù)(插入操作必須提交)。
5. 查詢數(shù)據(jù)
使用 select 查詢數(shù)據(jù),結(jié)果通過 fetchone() 或 fetchall() 獲取。
# 查詢所有用戶
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
# 條件查詢
cursor.execute("SELECT name, age FROM users WHERE age > ?", (30,))
result = cursor.fetchone()
print(result)- 解釋:
select * from users:查詢users表的所有字段。fetchall():獲取所有查詢結(jié)果(返回列表)。fetchone():獲取單條結(jié)果(返回元組)。where age > ?:篩選age大于指定值的記錄。
6. 更新數(shù)據(jù)
使用 update 修改已有數(shù)據(jù)。
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, 'Alice'))
conn.commit()- 解釋:
set age = ?:將age字段更新為新值。where name = ?:僅更新name為'Alice'的記錄。conn.commit()提交事務(wù)。
7. 刪除數(shù)據(jù)
使用 delete from 刪除數(shù)據(jù)。
cursor.execute("DELETE FROM users WHERE name = 'Bob'")
conn.commit()- 解釋:
delete from users:刪除users表中的記錄。where name = 'Bob':僅刪除name為'Bob'的記錄。conn.commit()提交事務(wù)。
8. 創(chuàng)建索引(可選)
索引可以加速查詢,但會降低插入/更新速度。
cursor.execute("CREATE INDEX idx_name ON users (name)")
conn.commit()- 解釋:
create index idx_name on users (name):為users表的name字段創(chuàng)建索引。
9. 事務(wù)處理
SQLite 支持事務(wù)(begin, commit, rollback),確保操作的原子性。
try:
# 開始事務(wù)
conn.execute("BEGIN")
# 執(zhí)行多條操作
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('David', 28))
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (29, 'David'))
# 提交事務(wù)
conn.commit()
except Exception as e:
print("事務(wù)失敗,回滾:", e)
conn.rollback() # 回滾事務(wù)- 解釋:
begin:顯式開始事務(wù)(默認(rèn)情況下,每條語句都是獨立事務(wù))。conn.commit():提交事務(wù)(所有操作生效)。conn.rollback():回滾事務(wù)(撤銷所有未提交的操作)。
10. 關(guān)閉連接
操作完成后,關(guān)閉游標(biāo)和數(shù)據(jù)庫連接。
cursor.close() conn.close()
- 解釋:
- 關(guān)閉游標(biāo)和連接釋放資源,避免內(nèi)存泄漏。
完整示例代碼
import sqlite3
# 1. 連接數(shù)據(jù)庫
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# 2. 創(chuàng)建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
)
''')
conn.commit()
# 3. 插入數(shù)據(jù)
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
('Alice', 25, 'alice@example.com'))
conn.commit()
# 4. 查詢數(shù)據(jù)
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
# 5. 更新數(shù)據(jù)
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, 'Alice'))
conn.commit()
# 6. 刪除數(shù)據(jù)
cursor.execute("DELETE FROM users WHERE name = 'Alice'")
conn.commit()
# 7. 關(guān)閉連接
cursor.close()
conn.close()常見錯誤與避坑指南
忘記提交事務(wù)
- 錯誤:插入/更新/刪除后未調(diào)用
conn.commit()。 - 修正:每次修改數(shù)據(jù)后必須調(diào)用
conn.commit()。
- 錯誤:插入/更新/刪除后未調(diào)用
SQL 注入風(fēng)險
- 錯誤:直接拼接 SQL 語句(如
f"INSERT INTO users VALUES ({name})")。 - 修正:使用參數(shù)化查詢(如
VALUES (?, ?))。
- 錯誤:直接拼接 SQL 語句(如
字段名與保留字沖突
- 錯誤:使用
order,group等保留字作為字段名。 - 修正:避免使用保留字,或用引號包裹字段名(如
"order")。
- 錯誤:使用
未關(guān)閉連接
- 錯誤:程序結(jié)束時未關(guān)閉
cursor和conn。 - 修正:使用
with上下文管理器自動關(guān)閉資源:with sqlite3.connect('example.db') as conn: cursor = conn.cursor() # 執(zhí)行操作...
- 錯誤:程序結(jié)束時未關(guān)閉
總結(jié)
到此這篇關(guān)于python連接sqlite3簡單用法的文章就介紹到這了,更多相關(guān)python連接sqlite3用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于python實現(xiàn)判斷字符串是否數(shù)字算法
這篇文章主要介紹了基于python實現(xiàn)判斷字符串是否數(shù)字算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
Python3 無重復(fù)字符的最長子串的實現(xiàn)
這篇文章主要介紹了Python3 無重復(fù)字符的最長子串的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
關(guān)于Keras模型可視化教程及關(guān)鍵問題的解決
今天小編就為大家分享一篇關(guān)于Keras模型可視化教程及關(guān)鍵問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

