通過(guò)python封裝SQLite3的示例代碼
創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例
from main import SQLiteDB
?
db = SQLiteDB("example.db")
使用execute直接執(zhí)行SQL
db.execute("INSERT INTO user (name, amount, createtime) VALUES (?, ?, ?)",("張三", 25.6, '2023-07-01 15:25:30'))
創(chuàng)建表
# 創(chuàng)建表
db.execute("""
CREATE TABLE users(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE,
created_at TEXT DEFAULT (datetime('now', 'localtime'))
);
""")
插入示例
# 單個(gè)插入
db.insert("user",['name', 'amount', 'createtime'],('李四', 25.6, '2023-07-01 15:25:30'))
?
# 元組列表批量插入
fields = ['name', 'amount', 'createtime']
values = [
('用戶1', 22, '2024-11-12 12:13:11'),
('用戶2', 23, '2024-11-12 12:13:11'),
('用戶3', 24, '2024-11-12 12:13:11')
]
db.batch_insert('user', fields, values)
?
# 字典列表批量插入
users_dict = [
{'name': '小明', 'amount': 22, 'createtime': '2024-11-12 12:13:11'},
{'name': '小紅', 'amount': 24, 'createtime': '2024-11-12 12:13:11'},
{'name': '小張', 'amount': 26, 'createtime': '2024-11-12 12:13:11'}
]
db.insert_many_dict('user', users_dict)
刪除示例
# 按條件刪除
affected_rows = db.delete("user", "age > ?", (30,))
?
# 按ID刪除
db.delete_by_id("user", 1)
?
# 批量刪除
id_list = [1, 2, 3, 4, 5]
db.delete_many("user", id_list)
?
# 清空表
db.truncate_table("user")
修改示例
# 基礎(chǔ)更新
db.update('users', ['name', 'age'], ('張三', 25), 'id = ?', (1,))
?
# 通過(guò)ID更新
db.update_by_id('users', ['name', 'age'], ('張三', 25), 1)
?
# 使用字典更新
db.update_dict('users', {'name': '張三', 'age': 25}, 'id = ?', (1,))
?
# 批量更新字典數(shù)據(jù)
dict_list = [
{'id': 1, 'name': '張三', 'age': 25, 'email': 'zhangsan@example.com'},
{'id': 2, 'name': '李四', 'age': 30, 'email': 'lisi@example.com'}
]
db.batch_update_dict('users', dict_list)
?
# 批量更新
values_list = [
('張三', 25, 1),
('李四', 30, 2)
]
db.batch_update('users', ['name', 'age'], values_list)
查詢示例
# 查詢單條記錄
result = db.fetch_one("SELECT *FROM user WHERE name = ?", ("張三",))
# 分頁(yè)查詢
db.fetch_page("SELECT * FROM user", 3, 2)
# 查詢多條記錄
results = db.fetch_all("SELECT *FROM user LIMIT 5")
for row in results:
print(row)
# 條件查詢
results = db.fetch_all("SELECT *FROM user WHERE amount > ?", (20,))
for row in results:
print(row)
聯(lián)表查詢示例
假設(shè)有兩個(gè)表:user和orders
內(nèi)連接查詢示例
sql = """
SELECT u.name, o.order_number, o.amount
FROM user u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.amount > ?
"""
results = db.fetch_all(sql, (100,))
?
for row in results:
print(row)
左連接查詢示例
sql = """
SELECT u.name, COUNT(o.id) as order_count
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id
"""
results = db.fetch_all(sql)
?
for row in results:
print(row)
SQLiteDB
import sqlite3
class SQLiteDB:
def __init__(self, db_name):
"""初始化數(shù)據(jù)庫(kù)連接"""
self.conn = None
self.cursor = None
try:
self.conn = sqlite3.connect(db_name)
self.cursor = self.conn.cursor()
except sqlite3.Error as e:
print(f"連接數(shù)據(jù)庫(kù)時(shí)出錯(cuò): {e}")
def execute(self, sql, params=None):
"""執(zhí)行SQL查詢
參數(shù):
sql: SQL語(yǔ)句
params: SQL參數(shù),用于參數(shù)化查詢
返回:
執(zhí)行成功返回True,失敗返回False
"""
try:
if params:
self.cursor.execute(sql, params)
else:
self.cursor.execute(sql)
self.conn.commit()
return True
except sqlite3.Error as e:
print(f"執(zhí)行查詢時(shí)出錯(cuò): {e}")
return False
# 創(chuàng)建表
def create_table(self, table_name, fields):
"""創(chuàng)建數(shù)據(jù)表
參數(shù):
table_name: 表名
fields: 字段定義列表,每個(gè)元素是一個(gè)元組 (字段名, 類型定義)
返回:
執(zhí)行成功返回True,失敗返回False
"""
try:
fields_str = ', '.join([f"{name} {definition}" for name, definition in fields])
sql = f"CREATE TABLE IF NOT EXISTS {table_name} ({fields_str})"
return self.execute(sql)
except sqlite3.Error as e:
print(f"創(chuàng)建表時(shí)出錯(cuò): {e}")
return False
# 插入##########################################
def insert(self, table_name, fields, values):
"""插入數(shù)據(jù)
參數(shù):
table_name: 表名
fields: 字段名列表,例如 ['name', 'age']
values: 值列表,例如 ('張三', 25)
返回:
執(zhí)行成功返回True,失敗返回False
"""
try:
# 構(gòu)建SQL語(yǔ)句
placeholders = ','.join(['?' for _ in fields])
fields_str = ','.join(fields)
sql = f"INSERT INTO {table_name} ({fields_str}) VALUES({placeholders})"
return self.execute(sql, values)
except sqlite3.Error as e:
print(f"插入數(shù)據(jù)時(shí)出錯(cuò): {e}")
self.conn.rollback() # 發(fā)生錯(cuò)誤時(shí)回滾
return False
# 批量插入1
def batch_insert(self, table_name, fields, values_list):
"""批量插入數(shù)據(jù)
參數(shù):
table_name: 表名
fields: 字段名列表,例如 ['name', 'age']
values_list: 值列表,每個(gè)元素是一個(gè)元組,例如 [('張三', 25), ('李四', 30)]
返回:
執(zhí)行成功返回True,失敗返回False
"""
try:
# 構(gòu)建SQL語(yǔ)句
placeholders = ','.join(['?' for _ in fields])
fields_str = ','.join(fields)
sql = f"INSERT INTO {table_name} ({fields_str}) VALUES ({placeholders})"
# 執(zhí)行批量插入
self.cursor.executemany(sql, values_list)
self.conn.commit()
return True
except sqlite3.Error as e:
print(f"批量插入數(shù)據(jù)時(shí)出錯(cuò): {e}")
self.conn.rollback() # 發(fā)生錯(cuò)誤時(shí)回滾
return False
# 批量插入2
def insert_many_dict(self, table_name, dict_list):
"""使用字典列表批量插入數(shù)據(jù)
參數(shù):
table_name: 表名
dict_list: 字典列表,每個(gè)字典代表一行數(shù)據(jù),例如:
[{'name': '張三', 'age': 25}, {'name': '李四', 'age': 30}]
返回:
執(zhí)行成功返回True,失敗返回False
"""
if not dict_list:
return False
try:
# 從第一個(gè)字典獲取字段名
fields = list(dict_list[0].keys())
# 轉(zhuǎn)換字典列表為值列表
values_list = [tuple(d.values()) for d in dict_list]
return self.batch_insert(table_name, fields, values_list)
except Exception as e:
print(f"處理字典數(shù)據(jù)時(shí)出錯(cuò): {e}")
return False
############################################################
# 刪除###########################################
def delete(self, table_name, condition, params=None):
"""刪除數(shù)據(jù)
參數(shù):
table_name: 表名
condition: WHERE條件語(yǔ)句,例如 "age > ?" 或 "name = ?"
params: 條件參數(shù),例如 (20,) 或 ('張三',)
返回:
執(zhí)行成功返回受影響的行數(shù),失敗返回-1
"""
try:
sql = f"DELETE FROM {table_name} WHERE {condition}"
self.cursor.execute(sql, params or ())
self.conn.commit()
return self.cursor.rowcount
except sqlite3.Error as e:
print(f"刪除數(shù)據(jù)時(shí)出錯(cuò): {e}")
self.conn.rollback()
return -1
def delete_by_id(self, table_name, id_value, id_field='id'):
"""根據(jù)ID刪除數(shù)據(jù)
參數(shù):
table_name: 表名
id_value: ID值
id_field: ID字段名,默認(rèn)為'id'
返回:
執(zhí)行成功返回受影響的行數(shù),失敗返回-1
"""
return self.delete(table_name, f"{id_field} = ?", (id_value,))
def delete_many(self, table_name, id_list, id_field='id'):
"""批量刪除數(shù)據(jù)
參數(shù):
table_name: 表名
id_list: ID列表
id_field: ID字段名,默認(rèn)為'id'
返回:
執(zhí)行成功返回受影響的行數(shù),失敗返回-1
"""
try:
placeholders = ','.join(['?' for _ in id_list])
sql = f"DELETE FROM {table_name} WHERE {id_field} IN ({placeholders})"
self.cursor.execute(sql, id_list)
self.conn.commit()
return self.cursor.rowcount
except sqlite3.Error as e:
print(f"批量刪除數(shù)據(jù)時(shí)出錯(cuò): {e}")
self.conn.rollback()
return -1
def truncate_table(self, table_name):
"""清空表數(shù)據(jù)
參數(shù):
table_name: 表名
返回:
執(zhí)行成功返回True,失敗返回False
"""
try:
self.cursor.execute(f"DELETE FROM {table_name}")
self.conn.commit()
return True
except sqlite3.Error as e:
print(f"清空表數(shù)據(jù)時(shí)出錯(cuò): {e}")
self.conn.rollback()
return False
############################################################
# 更新###########################################
def update(self, table_name, fields, values, condition, condition_params=None):
"""更新數(shù)據(jù)
參數(shù):
table_name: 表名
fields: 要更新的字段列表,例如 ['name', 'age']
values: 新的值列表,例如 ('張三', 25)
condition: WHERE條件語(yǔ)句,例如 "id = ?"
condition_params: 條件參數(shù),例如 (1,)
返回:
執(zhí)行成功返回受影響的行數(shù),失敗返回-1
"""
try:
# 構(gòu)建SET子句
set_clause = ','.join([f"{field} = ?" for field in fields])
sql = f"UPDATE {table_name} SET {set_clause} WHERE {condition}"
# 合并values和condition_params
params = list(values)
if condition_params:
params.extend(condition_params)
self.cursor.execute(sql, params)
self.conn.commit()
return self.cursor.rowcount
except sqlite3.Error as e:
print(f"更新數(shù)據(jù)時(shí)出錯(cuò): {e}")
self.conn.rollback()
return -1
def update_by_id(self, table_name, fields, values, id_value, id_field='id'):
"""根據(jù)ID更新數(shù)據(jù)
參數(shù):
table_name: 表名
fields: 要更新的字段列表,例如 ['name', 'age']
values: 新的值列表,例如 ('張三', 25)
id_value: ID值
id_field: ID字段名,默認(rèn)為'id'
返回:
執(zhí)行成功返回受影響的行數(shù),失敗返回-1
"""
return self.update(table_name, fields, values, f"{id_field} = ?", (id_value,))
def update_dict(self, table_name, update_dict, condition, condition_params=None):
"""使用字典更新數(shù)據(jù)
參數(shù):
table_name: 表名
update_dict: 要更新的字段和值的字典,例如 {'name': '張三', 'age': 25}
condition: WHERE條件語(yǔ)句,例如 "id = ?"
condition_params: 條件參數(shù),例如 (1,)
返回:
執(zhí)行成功返回受影響的行數(shù),失敗返回-1
"""
fields = list(update_dict.keys())
values = list(update_dict.values())
return self.update(table_name, fields, values, condition, condition_params)
def batch_update_dict(self, table_name, dict_list, id_field='id'):
"""使用字典列表批量更新數(shù)據(jù)
參數(shù):
table_name: 表名
dict_list: 字典列表,每個(gè)字典必須包含id_field字段,例如:
[{'id': 1, 'name': '張三', 'age': 25},
{'id': 2, 'name': '李四', 'age': 30}]
id_field: ID字段名,默認(rèn)為'id'
返回:
執(zhí)行成功返回受影響的行數(shù),失敗返回-1
"""
if not dict_list:
return 0
try:
# 從第一個(gè)字典獲取所有字段名(排除ID字段)
fields = [f for f in dict_list[0].keys() if f != id_field]
# 轉(zhuǎn)換字典列表為值列表
values_list = []
for d in dict_list:
# 確保字典中包含ID字段
if id_field not in d:
raise ValueError(f"字典中缺少 {id_field} 字段")
# 構(gòu)建值元組:先添加要更新的字段值,最后添加ID值
values = tuple(d[f] for f in fields)
values += (d[id_field],)
values_list.append(values)
return self.batch_update(table_name, fields, values_list, id_field)
except Exception as e:
print(f"批量更新字典數(shù)據(jù)時(shí)出錯(cuò): {e}")
return -1
def batch_update(self, table_name, fields, values_list, id_field='id'):
"""批量更新數(shù)據(jù)
參數(shù):
table_name: 表名
fields: 要更新的字段列表,例如 ['name', 'age']
values_list: 值列表,每個(gè)元素是一個(gè)元組,包含新值和ID,例如 [('張三', 25, 1), ('李四', 30, 2)]
id_field: ID字段名,默認(rèn)為'id'
返回:
執(zhí)行成功返回受影響的行數(shù),失敗返回-1
"""
try:
# 構(gòu)建SET子句
set_clause = ','.join([f"{field} = ?" for field in fields])
sql = f"UPDATE {table_name} SET {set_clause} WHERE {id_field} = ?"
self.cursor.executemany(sql, values_list)
self.conn.commit()
return self.cursor.rowcount
except sqlite3.Error as e:
print(f"批量更新數(shù)據(jù)時(shí)出錯(cuò): {e}")
self.conn.rollback()
return -1
############################################################
# 查詢
def fetch_all(self, sql, params=None):
"""獲取所有查詢結(jié)果
參數(shù):
sql: SQL查詢語(yǔ)句
params: SQL參數(shù),用于參數(shù)化查詢
返回:
查詢結(jié)果列表,失敗返回空列表
"""
try:
if params:
self.cursor.execute(sql, params)
else:
self.cursor.execute(sql)
return self.cursor.fetchall()
except sqlite3.Error as e:
print(f"獲取數(shù)據(jù)時(shí)出錯(cuò): {e}")
return []
# 分頁(yè)查詢
def fetch_page(self, sql, page_num, page_size, params=None):
page_sql = f" limit {(page_num - 1) * page_size},{page_size}"
print(sql + page_sql)
return self.fetch_all(sql + page_sql, params)
def fetch_one(self, sql, params=None):
"""獲取單條查詢結(jié)果
參數(shù):
sql: SQL查詢語(yǔ)句
params: SQL參數(shù),用于參數(shù)化查詢
返回:
單條查詢結(jié)果,失敗返回None
"""
try:
if params:
self.cursor.execute(sql, params)
else:
self.cursor.execute(sql)
return self.cursor.fetchone()
except sqlite3.Error as e:
print(f"獲取數(shù)據(jù)時(shí)出錯(cuò): {e}")
return None
############################################################
# 銷(xiāo)毀對(duì)象時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接
def __del__(self):
try:
self.execute("VACUUM;")
"""關(guān)閉數(shù)據(jù)庫(kù)連接"""
if self.conn:
self.cursor.close()
self.conn.close()
except sqlite3.Error as e:
pass
到此這篇關(guān)于通過(guò)python封裝SQLite3的示例代碼的文章就介紹到這了,更多相關(guān)python封裝SQLite3內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中如何使用sqlite3操作SQLite數(shù)據(jù)庫(kù)詳解
- 使用Python連接SQLite數(shù)據(jù)庫(kù)的操作步驟
- 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)文章
使用python3.0?對(duì)接美團(tuán)接口的實(shí)現(xiàn)示例
本文主要介紹了python3.0?對(duì)接美團(tuán)接口的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Python實(shí)現(xiàn)時(shí)間序列變化點(diǎn)檢測(cè)功能
平穩(wěn)性是時(shí)間序列分析與預(yù)測(cè)的核心概念,在平穩(wěn)條件下,時(shí)間序列的統(tǒng)計(jì)特性(如均值)在時(shí)間維度上保持不變,僅存在隨機(jī)波動(dòng),但是時(shí)間序列通常會(huì)經(jīng)歷結(jié)構(gòu)性斷裂或變化,本文給大家介紹了Python實(shí)現(xiàn)時(shí)間序列變化點(diǎn)檢測(cè)功能,需要的朋友可以參考下2024-09-09
Python使用collections模塊實(shí)現(xiàn)擴(kuò)展數(shù)據(jù)類
Python?標(biāo)準(zhǔn)庫(kù)提供了一個(gè)?collections?模塊,里面提供了很多的數(shù)據(jù)類,在工作中使用這些類能夠簡(jiǎn)化我們的開(kāi)發(fā),本文就來(lái)看看collections是如何實(shí)現(xiàn)擴(kuò)展數(shù)據(jù)類的吧2023-06-06
淺談TensorFlow中讀取圖像數(shù)據(jù)的三種方式
這篇文章主要介紹了淺談TensorFlow中讀取圖像數(shù)據(jù)的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
python爬取B站關(guān)注列表及數(shù)據(jù)庫(kù)的設(shè)計(jì)與操作
這篇文章主要為大家介紹了python爬取B站關(guān)注列表及數(shù)據(jù)庫(kù)的設(shè)計(jì)與操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
python getpass實(shí)現(xiàn)密文實(shí)例詳解
這篇文章主要介紹了python getpass實(shí)現(xiàn)密文實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
從運(yùn)行效率與開(kāi)發(fā)效率比較Python和C++
今天小編就為大家分享一篇關(guān)于從運(yùn)行效率與開(kāi)發(fā)效率比較Python和C++,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12

