數(shù)據(jù)庫的建立
conn = sqlite3.connect('db名')
這是建立connect連接時用到的,當(dāng)項目中不存在該數(shù)據(jù)庫時占遥,會自動創(chuàng)建纵揍。
數(shù)據(jù)類型:
NULL: 表示該值為NULL值。
INTEGER: 無符號整型值肮街。
REAL: 浮點值先慷。
TEXT: 文本字符串饮笛,存儲使用的編碼方式為UTF-8、UTF-16BE论熙、UTF-16LE福青。
BLOB: 存儲Blob數(shù)據(jù),該類型數(shù)據(jù)和輸入數(shù)據(jù)完全相同。
建表例子:
CREATE TABLE Custom (
id INTEGER PRIMARY KEY DEFAULT NULL,
custom_name VARCHAR(50) NOT NULL,
remark TEXT DEFAULT NULL DEFAULT '無'
);
CREATE TABLE Provice_info(
id INTEGER PRIMARY KEY NOT NULL,
custom INT NOT NULL,
provice_name VARCHAR(20) NOT NULL,
first_weight_num REAL,
first_weight_price REAL,
next_weight_price REAL,
FOREIGN KEY (custom) REFERENCES Custom(id) on delete cascade
)
常見操作
使用sqlite无午,首先需要建立connect連接媒役,然后通過cursor(游標(biāo))來對數(shù)據(jù)進(jìn)行操作(execute),當(dāng)是查操作時宪迟,就不需要connect.commit()
了酣衷,可以通過cursor.fetchone() / cursor.fetchall()
來獲取查到的數(shù)據(jù),前者為一個元組次泽,后者為一個列表穿仪,列表中存儲著元組,最后記得關(guān)閉connect連接就行了意荤。
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute(SQL)
conn.commit()
conn.close()
經(jīng)驗操作
當(dāng)使用SQLite進(jìn)行操作時啊片,最好以表為類來面向?qū)ο缶幊獭?/p>
在add操作時,可以在
connect.commit()
后通過cursor.lastrowid
來獲取剛剛創(chuàng)建的數(shù)據(jù)的id并返回玖像,有時會有意想不到的方便紫谷。在delete操作時,當(dāng)有外鍵時捐寥,想聯(lián)級刪除的話笤昨,除了在創(chuàng)建表的時候加上
on delete cascade
還需要通過cursor.execute("PRAGMA foreign_keys=ON")
這條語句才能實現(xiàn)聯(lián)級刪除。在針對查找方面握恳,可以創(chuàng)建多個查找方法瞒窒,如精確查找,模糊匹配睡互,查詢?nèi)扛停@些有時有意想不到的方便陵像。
針對防止SQL注入就珠,可以通過SQLite特有的語法
?
,結(jié)合execute(SQL, (parameter1, parameter2...))
來實現(xiàn)醒颖。
例子:
class Custom:
def __init__(self):
self.conn = sqlite3.connect('test.db')
self.cur = self.conn.cursor()
def add_custom(self, custom_name, remark='無'):
"""
添加一條客戶數(shù)據(jù)妻怎,加了去重檢查,保證客戶數(shù)據(jù)唯一性
:param custom_name:
:param remark:
:return: id
"""
if self.find_custom(custom_name) > 0:
raise Exception('你輸入的用戶名 {} 已存在泞歉!'.format(custom_name))
SQL = """
INSERT INTO Custom (custom_name, remark) VALUES (?, ?);
"""
# 防止SQL注入攻擊
self.cur.execute(SQL, (custom_name, remark))
self.conn.commit()
custom_id = self.cur.lastrowid
return custom_id
def delete_custom(self, custom_id):
SQL = """
DELETE FROM Custom WHERE id=?
"""
# SQLite在3.6.19版本中才開始支持外鍵約束逼侦,但是為了兼容以前的程序,
# 默認(rèn)并沒有啟用該功能腰耙,如果要啟用該功能每次都要需要使用如下語句:PRAGMA foreign_keys = ON來打開榛丢。
self.cur.execute("PRAGMA foreign_keys=ON")
self.cur.execute(SQL, (custom_id,))
self.conn.commit()
def update_custom(self, custom_id, custom_name, remark='無'):
SQL = """
UPDATE Custom SET custom_name=?, remark=? WHERE id=?
"""
self.cur.execute(SQL, (custom_name, remark, custom_id))
self.conn.commit()
def find_custom(self, custom_name):
"""
通過客戶名找到id
:param custom_name:
:return: id(int) / 0(沒有該數(shù)據(jù)時)
"""
SQL = """
SELECT id FROM Custom WHERE custom_name=?
"""
self.cur.execute(SQL, (custom_name,))
custom_id = self.cur.fetchone()
return custom_id[0] if custom_id else 0
def find_custom_like(self, custom_name):
"""
通過客戶名找到id
:param custom_name:
:return: id(int) / 0(沒有該數(shù)據(jù)時)
"""
SQL = """
SELECT id FROM Custom WHERE custom_name LIKE '%{}%'
""".format(custom_name)
self.cur.execute(SQL)
custom_id = self.cur.fetchall()
print(custom_id)
if len(custom_id) > 1:
raise Exception('客戶名: {} 錯誤,請傳入正確的客戶名挺庞!'.format(custom_name))
return custom_id[0][0] if custom_id else 0
def fetch_custom(self):
"""
返回所有custom對象
:return: {'客戶1': 'remark1', '客戶2': 'remark2' ...}
"""
SQL = """
SELECT custom_name, remark FROM Custom
"""
self.cur.execute(SQL)
customs = self.cur.fetchall()
data = {custom_name: remark for custom_name, remark in customs}
return data
def close(self):
self.cur.close()
self.conn.close()