SQLite數(shù)據(jù)庫操作

詳細見:https://blog.csdn.net/yingshukun/article/details/94005900

操作實例:

#python sqlite

#Author : Hongten

#MailTo : hongtenzone@foxmail.com

#QQ? ? : 648719819

#Blog? : http://www.cnblogs.com/hongten

#Create : 2013-08-09

#Version: 1.0

#DB-API 2.0 interface for SQLite databases

import sqlite3

import os

'''SQLite數(shù)據(jù)庫是一款非常小巧的嵌入式開源數(shù)據(jù)庫軟件趁怔,也就是說

沒有獨立的維護進程谨究,所有的維護都來自于程序本身舔箭。

在python中,使用sqlite3創(chuàng)建數(shù)據(jù)庫的連接颊郎,當我們指定的數(shù)據(jù)庫文件不存在的時候

連接對象會自動創(chuàng)建數(shù)據(jù)庫文件;如果數(shù)據(jù)庫文件已經(jīng)存在,則連接對象不會再創(chuàng)建

數(shù)據(jù)庫文件诫舅,而是直接打開該數(shù)據(jù)庫文件。

? ? 連接對象可以是硬盤上面的數(shù)據(jù)庫文件宫患,也可以是建立在內(nèi)存中的刊懈,在內(nèi)存中的數(shù)據(jù)庫

? ? 執(zhí)行完任何操作后,都不需要提交事務(wù)的(commit)

? ? 創(chuàng)建在硬盤上面: conn = sqlite3.connect('c:\\test\\test.db')

? ? 創(chuàng)建在內(nèi)存上面: conn = sqlite3.connect('"memory:')

? ? 下面我們一硬盤上面創(chuàng)建數(shù)據(jù)庫文件為例來具體說明:

? ? conn = sqlite3.connect('c:\\test\\hongten.db')

? ? 其中conn對象是數(shù)據(jù)庫鏈接對象娃闲,而對于數(shù)據(jù)庫鏈接對象來說虚汛,具有以下操作:

? ? ? ? commit()? ? ? ? ? ? --事務(wù)提交

? ? ? ? rollback()? ? ? ? ? --事務(wù)回滾

? ? ? ? close()? ? ? ? ? ? --關(guān)閉一個數(shù)據(jù)庫鏈接

? ? ? ? cursor()? ? ? ? ? ? --創(chuàng)建一個游標

? ? cu = conn.cursor()

? ? 這樣我們就創(chuàng)建了一個游標對象:cu

? ? 在sqlite3中,所有sql語句的執(zhí)行都要在游標對象的參與下完成

? ? 對于游標對象cu皇帮,具有以下具體操作:

? ? ? ? execute()? ? ? ? ? --執(zhí)行一條sql語句

? ? ? ? executemany()? ? ? --執(zhí)行多條sql語句

? ? ? ? close()? ? ? ? ? ? --游標關(guān)閉

? ? ? ? fetchone()? ? ? ? ? --從結(jié)果中取出一條記錄

? ? ? ? fetchmany()? ? ? ? --從結(jié)果中取出多條記錄

? ? ? ? fetchall()? ? ? ? ? --從結(jié)果中取出所有記錄

? ? ? ? scroll()? ? ? ? ? ? --游標滾動

'''

#global var

#數(shù)據(jù)庫文件絕句路徑

DB_FILE_PATH = ''

#表名稱

TABLE_NAME = ''

#是否打印sql

SHOW_SQL = True

def get_conn(path):

? ? '''獲取到數(shù)據(jù)庫的連接對象卷哩,參數(shù)為數(shù)據(jù)庫文件的絕對路徑

? ? 如果傳遞的參數(shù)是存在,并且是文件属拾,那么就返回硬盤上面改

? ? 路徑下的數(shù)據(jù)庫文件的連接對象将谊;否則,返回內(nèi)存中的數(shù)據(jù)接

? ? 連接對象'''

? ? conn = sqlite3.connect(path)

? ? if os.path.exists(path) and os.path.isfile(path):

? ? ? ? print('硬盤上面:[{}]'.format(path))

? ? ? ? return conn

? ? else:

? ? ? ? conn = None

? ? ? ? print('內(nèi)存上面:[:memory:]')

? ? ? ? return sqlite3.connect(':memory:')

def get_cursor(conn):

? ? '''該方法是獲取數(shù)據(jù)庫的游標對象渐白,參數(shù)為數(shù)據(jù)庫的連接對象

? ? 如果數(shù)據(jù)庫的連接對象不為None尊浓,則返回數(shù)據(jù)庫連接對象所創(chuàng)

? ? 建的游標對象;否則返回一個游標對象纯衍,該對象是內(nèi)存中數(shù)據(jù)

? ? 庫連接對象所創(chuàng)建的游標對象'''

? ? if conn is not None:

? ? ? ? return conn.cursor()

? ? else:

? ? ? ? return get_conn('').cursor()

###############################################################

####? ? ? ? ? ? 創(chuàng)建|刪除表操作? ? START

###############################################################

def drop_table(conn, table):

? ? '''如果表存在,則刪除表眠砾,如果表中存在數(shù)據(jù)的時候,使用該

? ? 方法的時候要慎用托酸!'''

? ? if table is not None and table != '':

? ? ? ? sql = 'DROP TABLE IF EXISTS ' + table

? ? ? ? if SHOW_SQL:

? ? ? ? ? ? print('執(zhí)行sql:[{}]'.format(sql))

? ? ? ? cu = get_cursor(conn)

? ? ? ? cu.execute(sql)

? ? ? ? conn.commit()

? ? ? ? print('刪除數(shù)據(jù)庫表[{}]成功!'.format(table))

? ? ? ? close_all(conn, cu)

? ? else:

? ? ? ? print('the [{}] is empty or equal None!'.format(sql))

def create_table(conn, sql):

? ? '''創(chuàng)建數(shù)據(jù)庫表:student'''

? ? if sql is not None and sql != '':

? ? ? ? cu = get_cursor(conn)

? ? ? ? if SHOW_SQL:

? ? ? ? ? ? print('執(zhí)行sql:[{}]'.format(sql))

? ? ? ? cu.execute(sql)

? ? ? ? conn.commit()

? ? ? ? print('創(chuàng)建數(shù)據(jù)庫表[student]成功!')

? ? ? ? close_all(conn, cu)

? ? else:

? ? ? ? print('the [{}] is empty or equal None!'.format(sql))

###############################################################

####? ? ? ? ? ? 創(chuàng)建|刪除表操作? ? END

###############################################################

def close_all(conn, cu):

? ? '''關(guān)閉數(shù)據(jù)庫游標對象和數(shù)據(jù)庫連接對象'''

? ? try:

? ? ? ? if cu is not None:

? ? ? ? ? ? cu.close()

? ? finally:

? ? ? ? if cu is not None:

? ? ? ? ? ? cu.close()

###############################################################

####? ? ? ? ? ? 數(shù)據(jù)庫操作CRUD? ? START

###############################################################

def save(conn, sql, data):

? ? '''插入數(shù)據(jù)'''

? ? if sql is not None and sql != '':

? ? ? ? if data is not None:

? ? ? ? ? ? cu = get_cursor(conn)

? ? ? ? ? ? for d in data:

? ? ? ? ? ? ? ? if SHOW_SQL:

? ? ? ? ? ? ? ? ? ? print('執(zhí)行sql:[{}],參數(shù):[{}]'.format(sql, d))

? ? ? ? ? ? ? ? cu.execute(sql, d)

? ? ? ? ? ? ? ? conn.commit()

? ? ? ? ? ? close_all(conn, cu)

? ? else:

? ? ? ? print('the [{}] is empty or equal None!'.format(sql))

def fetchall(conn, sql):

? ? '''查詢所有數(shù)據(jù)'''

? ? if sql is not None and sql != '':

? ? ? ? cu = get_cursor(conn)

? ? ? ? if SHOW_SQL:

? ? ? ? ? ? print('執(zhí)行sql:[{}]'.format(sql))

? ? ? ? cu.execute(sql)

? ? ? ? r = cu.fetchall()

? ? ? ? if len(r) > 0:

? ? ? ? ? ? for e in range(len(r)):

? ? ? ? ? ? ? ? print(r[e])

? ? else:

? ? ? ? print('the [{}] is empty or equal None!'.format(sql))

def fetchone(conn, sql, data):

? ? '''查詢一條數(shù)據(jù)'''

? ? if sql is not None and sql != '':

? ? ? ? if data is not None:

? ? ? ? ? ? #Do this instead

? ? ? ? ? ? d = (data,)

? ? ? ? ? ? cu = get_cursor(conn)

? ? ? ? ? ? if SHOW_SQL:

? ? ? ? ? ? ? ? print('執(zhí)行sql:[{}],參數(shù):[{}]'.format(sql, data))

? ? ? ? ? ? cu.execute(sql, d)

? ? ? ? ? ? r = cu.fetchall()

? ? ? ? ? ? if len(r) > 0:

? ? ? ? ? ? ? ? for e in range(len(r)):

? ? ? ? ? ? ? ? ? ? print(r[e])

? ? ? ? else:

? ? ? ? ? ? print('the [{}] equal None!'.format(data))

? ? else:

? ? ? ? print('the [{}] is empty or equal None!'.format(sql))

def update(conn, sql, data):

? ? '''更新數(shù)據(jù)'''

? ? if sql is not None and sql != '':

? ? ? ? if data is not None:

? ? ? ? ? ? cu = get_cursor(conn)

? ? ? ? ? ? for d in data:

? ? ? ? ? ? ? ? if SHOW_SQL:

? ? ? ? ? ? ? ? ? ? print('執(zhí)行sql:[{}],參數(shù):[{}]'.format(sql, d))

? ? ? ? ? ? ? ? cu.execute(sql, d)

? ? ? ? ? ? ? ? conn.commit()

? ? ? ? ? ? close_all(conn, cu)

? ? else:

? ? ? ? print('the [{}] is empty or equal None!'.format(sql))

def delete(conn, sql, data):

? ? '''刪除數(shù)據(jù)'''

? ? if sql is not None and sql != '':

? ? ? ? if data is not None:

? ? ? ? ? ? cu = get_cursor(conn)

? ? ? ? ? ? for d in data:

? ? ? ? ? ? ? ? if SHOW_SQL:

? ? ? ? ? ? ? ? ? ? print('執(zhí)行sql:[{}],參數(shù):[{}]'.format(sql, d))

? ? ? ? ? ? ? ? cu.execute(sql, d)

? ? ? ? ? ? ? ? conn.commit()

? ? ? ? ? ? close_all(conn, cu)

? ? else:

? ? ? ? print('the [{}] is empty or equal None!'.format(sql))

###############################################################

####? ? ? ? ? ? 數(shù)據(jù)庫操作CRUD? ? END

###############################################################

###############################################################

####? ? ? ? ? ? 測試操作? ? START

###############################################################

def drop_table_test():

? ? '''刪除數(shù)據(jù)庫表測試'''

? ? print('刪除數(shù)據(jù)庫表測試...')

? ? conn = get_conn(DB_FILE_PATH)

? ? drop_table(conn, TABLE_NAME)

def create_table_test():

? ? '''創(chuàng)建數(shù)據(jù)庫表測試'''

? ? print('創(chuàng)建數(shù)據(jù)庫表測試...')

? ? create_table_sql = '''CREATE TABLE `student` (

? ? ? ? ? ? ? ? ? ? ? ? ? `id` int(11) NOT NULL,

? ? ? ? ? ? ? ? ? ? ? ? ? `name` varchar(20) NOT NULL,

? ? ? ? ? ? ? ? ? ? ? ? ? `gender` varchar(4) DEFAULT NULL,

? ? ? ? ? ? ? ? ? ? ? ? ? `age` int(11) DEFAULT NULL,

? ? ? ? ? ? ? ? ? ? ? ? ? `address` varchar(200) DEFAULT NULL,

? ? ? ? ? ? ? ? ? ? ? ? ? `phone` varchar(20) DEFAULT NULL,

? ? ? ? ? ? ? ? ? ? ? ? ? PRIMARY KEY (`id`)

? ? ? ? ? ? ? ? ? ? ? ? )'''

? ? conn = get_conn(DB_FILE_PATH)

? ? create_table(conn, create_table_sql)

def save_test():

? ? '''保存數(shù)據(jù)測試...'''

? ? print('保存數(shù)據(jù)測試...')

? ? save_sql = '''INSERT INTO student values (?, ?, ?, ?, ?, ?)'''

? ? data = [(1, 'Hongten', '男', 20, '廣東省廣州市', '13423****62'),

? ? ? ? ? ? (2, 'Tom', '男', 22, '美國舊金山', '15423****63'),

? ? ? ? ? ? (3, 'Jake', '女', 18, '廣東省廣州市', '18823****87'),

? ? ? ? ? ? (4, 'Cate', '女', 21, '廣東省廣州市', '14323****32')]

? ? conn = get_conn(DB_FILE_PATH)

? ? save(conn, save_sql, data)

def fetchall_test():

? ? '''查詢所有數(shù)據(jù)...'''

? ? print('查詢所有數(shù)據(jù)...')

? ? fetchall_sql = '''SELECT * FROM student'''

? ? conn = get_conn(DB_FILE_PATH)

? ? fetchall(conn, fetchall_sql)

def fetchone_test():

? ? '''查詢一條數(shù)據(jù)...'''

? ? print('查詢一條數(shù)據(jù)...')

? ? fetchone_sql = 'SELECT * FROM student WHERE ID = ? '

? ? data = 1

? ? conn = get_conn(DB_FILE_PATH)

? ? fetchone(conn, fetchone_sql, data)

def update_test():

? ? '''更新數(shù)據(jù)...'''

? ? print('更新數(shù)據(jù)...')

? ? update_sql = 'UPDATE student SET name = ? WHERE ID = ? '

? ? data = [('HongtenAA', 1),

? ? ? ? ? ? ('HongtenBB', 2),

? ? ? ? ? ? ('HongtenCC', 3),

? ? ? ? ? ? ('HongtenDD', 4)]

? ? conn = get_conn(DB_FILE_PATH)

? ? update(conn, update_sql, data)

def delete_test():

? ? '''刪除數(shù)據(jù)...'''

? ? print('刪除數(shù)據(jù)...')

? ? delete_sql = 'DELETE FROM student WHERE NAME = ? AND ID = ? '

? ? data = [('HongtenAA', 1),

? ? ? ? ? ? ('HongtenCC', 3)]

? ? conn = get_conn(DB_FILE_PATH)

? ? delete(conn, delete_sql, data)

###############################################################

####? ? ? ? ? ? 測試操作? ? END

###############################################################

def init():

? ? '''初始化方法'''

? ? #數(shù)據(jù)庫文件絕句路徑

? ? global DB_FILE_PATH

? ? DB_FILE_PATH = 'c:\\test\\hongten.db'

? ? #數(shù)據(jù)庫表名稱

? ? global TABLE_NAME

? ? TABLE_NAME = 'student'

? ? #是否打印sql

? ? global SHOW_SQL

? ? SHOW_SQL = True

? ? print('show_sql : {}'.format(SHOW_SQL))

? ? #如果存在數(shù)據(jù)庫表褒颈,則刪除表

? ? drop_table_test()

? ? #創(chuàng)建數(shù)據(jù)庫表student

? ? create_table_test()

? ? #向數(shù)據(jù)庫表中插入數(shù)據(jù)

? ? save_test()


def main():

? ? init()

? ? fetchall_test()

? ? print('#' * 50)

? ? fetchone_test()

? ? print('#' * 50)

? ? update_test()

? ? fetchall_test()

? ? print('#' * 50)

? ? delete_test()

? ? fetchall_test()

if __name__ == '__main__':

? ? main()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市励堡,隨后出現(xiàn)的幾起案子谷丸,更是在濱河造成了極大的恐慌,老刑警劉巖应结,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刨疼,死亡現(xiàn)場離奇詭異泉唁,居然都是意外死亡,警方通過查閱死者的電腦和手機揩慕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門亭畜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迎卤,你說我怎么就攤上這事拴鸵。” “怎么了蜗搔?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵劲藐,是天一觀的道長。 經(jīng)常有香客問我樟凄,道長聘芜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任缝龄,我火速辦了婚禮汰现,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叔壤。我一直安慰自己服鹅,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布百新。 她就那樣靜靜地躺著企软,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭望。 梳的紋絲不亂的頭發(fā)上仗哨,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音铅辞,去河邊找鬼厌漂。 笑死,一個胖子當著我的面吹牛斟珊,可吹牛的內(nèi)容都是我干的苇倡。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼囤踩,長吁一口氣:“原來是場噩夢啊……” “哼旨椒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堵漱,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤综慎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勤庐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體示惊,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡好港,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了米罚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钧汹。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖录择,靈堂內(nèi)的尸體忽然破棺而出拔莱,到底是詐尸還是另有隱情,我是刑警寧澤糊肠,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站遗锣,受9級特大地震影響货裹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜精偿,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一弧圆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笔咽,春花似錦搔预、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甩十,卻和暖如春船庇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侣监。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工鸭轮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橄霉。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓窃爷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姓蜂。 傳聞我的和親對象是個殘疾皇子按厘,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容