'''SQLite數據庫是一款非常小巧的嵌入式開源數據庫軟件,也就是說 沒有獨立的維護進程,所有的維護都來自於程序本身。 在python中,使用sqlite3創建數據庫的連接,當我們指定的數據庫文件不存在的時候 連接對象會自動創建數據庫文件;如果數據庫文件已經存在,則連接對象不會再創建 數據庫文件,而是直接打開該數據庫文件。 連接對象可以是硬盤上面的數據庫文件,也可以是建立在內存中的,在內存中的數據庫 執行完任何操作后,都不需要提交事務的(commit) 創建在硬盤上面: conn = sqlite3.connect('c:\\test\\test.db') 創建在內存上面: conn = sqlite3.connect('"memory:') 下面我們一硬盤上面創建數據庫文件為例來具體說明: conn = sqlite3.connect('c:\\test\\hongten.db') 其中conn對象是數據庫鏈接對象,而對於數據庫鏈接對象來說,具有以下操作: commit() --事務提交 rollback() --事務回滾 close() --關閉一個數據庫鏈接 cursor() --創建一個游標 cu = conn.cursor() 這樣我們就創建了一個游標對象:cu 在sqlite3中,所有sql語句的執行都要在游標對象的參與下完成 對於游標對象cu,具有以下具體操作: execute() --執行一條sql語句 executemany() --執行多條sql語句 close() --游標關閉 fetchone() --從結果中取出一條記錄 fetchmany() --從結果中取出多條記錄 fetchall() --從結果中取出所有記錄 scroll() --游標滾動 '''
下面是我做的demo,在demo中,我做了很詳細的注釋和功能的演示,詳情如下:
運行效果:
當SHOW_SQL = False的時候:
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> ================================ RESTART ================================ >>> show_sql : False 刪除數據庫表測試... 硬盤上面:[c:\test\hongten.db] 刪除數據庫表[student]成功! 創建數據庫表測試... 硬盤上面:[c:\test\hongten.db] 創建數據庫表[student]成功! 保存數據測試... 硬盤上面:[c:\test\hongten.db] 查詢所有數據... 硬盤上面:[c:\test\hongten.db] (1, 'Hongten', '男', 20, '廣東省廣州市', '13423****62') (2, 'Tom', '男', 22, '美國舊金山', '15423****63') (3, 'Jake', '女', 18, '廣東省廣州市', '18823****87') (4, 'Cate', '女', 21, '廣東省廣州市', '14323****32') ################################################## 查詢一條數據... 硬盤上面:[c:\test\hongten.db] (1, 'Hongten', '男', 20, '廣東省廣州市', '13423****62') ################################################## 更新數據... 硬盤上面:[c:\test\hongten.db] 查詢所有數據... 硬盤上面:[c:\test\hongten.db] (1, 'HongtenAA', '男', 20, '廣東省廣州市', '13423****62') (2, 'HongtenBB', '男', 22, '美國舊金山', '15423****63') (3, 'HongtenCC', '女', 18, '廣東省廣州市', '18823****87') (4, 'HongtenDD', '女', 21, '廣東省廣州市', '14323****32') ################################################## 刪除數據... 硬盤上面:[c:\test\hongten.db] 查詢所有數據... 硬盤上面:[c:\test\hongten.db] (2, 'HongtenBB', '男', 22, '美國舊金山', '15423****63') (4, 'HongtenDD', '女', 21, '廣東省廣州市', '14323****32') >>>
當SHOW_SQL = True的時候:
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> ================================ RESTART ================================ >>> show_sql : True 刪除數據庫表測試... 硬盤上面:[c:\test\hongten.db] 執行sql:[DROP TABLE IF EXISTS student] 刪除數據庫表[student]成功! 創建數據庫表測試... 硬盤上面:[c:\test\hongten.db] 執行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`) )] 創建數據庫表[student]成功! 保存數據測試... 硬盤上面:[c:\test\hongten.db] 執行sql:[INSERT INTO student values (?, ?, ?, ?, ?, ?)],參數:[(1, 'Hongten', '男', 20, '廣東省廣州市', '13423****62')] 執行sql:[INSERT INTO student values (?, ?, ?, ?, ?, ?)],參數:[(2, 'Tom', '男', 22, '美國舊金山', '15423****63')] 執行sql:[INSERT INTO student values (?, ?, ?, ?, ?, ?)],參數:[(3, 'Jake', '女', 18, '廣東省廣州市', '18823****87')] 執行sql:[INSERT INTO student values (?, ?, ?, ?, ?, ?)],參數:[(4, 'Cate', '女', 21, '廣東省廣州市', '14323****32')] 查詢所有數據... 硬盤上面:[c:\test\hongten.db] 執行sql:[SELECT * FROM student] (1, 'Hongten', '男', 20, '廣東省廣州市', '13423****62') (2, 'Tom', '男', 22, '美國舊金山', '15423****63') (3, 'Jake', '女', 18, '廣東省廣州市', '18823****87') (4, 'Cate', '女', 21, '廣東省廣州市', '14323****32') ################################################## 查詢一條數據... 硬盤上面:[c:\test\hongten.db] 執行sql:[SELECT * FROM student WHERE ID = ? ],參數:[1] (1, 'Hongten', '男', 20, '廣東省廣州市', '13423****62') ################################################## 更新數據... 硬盤上面:[c:\test\hongten.db] 執行sql:[UPDATE student SET name = ? WHERE ID = ? ],參數:[('HongtenAA', 1)] 執行sql:[UPDATE student SET name = ? WHERE ID = ? ],參數:[('HongtenBB', 2)] 執行sql:[UPDATE student SET name = ? WHERE ID = ? ],參數:[('HongtenCC', 3)] 執行sql:[UPDATE student SET name = ? WHERE ID = ? ],參數:[('HongtenDD', 4)] 查詢所有數據... 硬盤上面:[c:\test\hongten.db] 執行sql:[SELECT * FROM student] (1, 'HongtenAA', '男', 20, '廣東省廣州市', '13423****62') (2, 'HongtenBB', '男', 22, '美國舊金山', '15423****63') (3, 'HongtenCC', '女', 18, '廣東省廣州市', '18823****87') (4, 'HongtenDD', '女', 21, '廣東省廣州市', '14323****32') ################################################## 刪除數據... 硬盤上面:[c:\test\hongten.db] 執行sql:[DELETE FROM student WHERE NAME = ? AND ID = ? ],參數:[('HongtenAA', 1)] 執行sql:[DELETE FROM student WHERE NAME = ? AND ID = ? ],參數:[('HongtenCC', 3)] 查詢所有數據... 硬盤上面:[c:\test\hongten.db] 執行sql:[SELECT * FROM student] (2, 'HongtenBB', '男', 22, '美國舊金山', '15423****63') (4, 'HongtenDD', '女', 21, '廣東省廣州市', '14323****32') >>>
=========================================
具體代碼:
=========================================
1 #python sqlite 2 3 #Author : Hongten 4 #MailTo : hongtenzone@foxmail.com 5 #QQ : 648719819 6 #Blog : http://www.cnblogs.com/hongten 7 #Create : 2013-08-09 8 #Version: 1.0 9 10 #DB-API 2.0 interface for SQLite databases 11 12 import sqlite3 13 import os 14 '''SQLite數據庫是一款非常小巧的嵌入式開源數據庫軟件,也就是說 15 沒有獨立的維護進程,所有的維護都來自於程序本身。 16 在python中,使用sqlite3創建數據庫的連接,當我們指定的數據庫文件不存在的時候 17 連接對象會自動創建數據庫文件;如果數據庫文件已經存在,則連接對象不會再創建 18 數據庫文件,而是直接打開該數據庫文件。 19 連接對象可以是硬盤上面的數據庫文件,也可以是建立在內存中的,在內存中的數據庫 20 執行完任何操作后,都不需要提交事務的(commit) 21 22 創建在硬盤上面: conn = sqlite3.connect('c:\\test\\test.db') 23 創建在內存上面: conn = sqlite3.connect('"memory:') 24 25 下面我們一硬盤上面創建數據庫文件為例來具體說明: 26 conn = sqlite3.connect('c:\\test\\hongten.db') 27 其中conn對象是數據庫鏈接對象,而對於數據庫鏈接對象來說,具有以下操作: 28 29 commit() --事務提交 30 rollback() --事務回滾 31 close() --關閉一個數據庫鏈接 32 cursor() --創建一個游標 33 34 cu = conn.cursor() 35 這樣我們就創建了一個游標對象:cu 36 在sqlite3中,所有sql語句的執行都要在游標對象的參與下完成 37 對於游標對象cu,具有以下具體操作: 38 39 execute() --執行一條sql語句 40 executemany() --執行多條sql語句 41 close() --游標關閉 42 fetchone() --從結果中取出一條記錄 43 fetchmany() --從結果中取出多條記錄 44 fetchall() --從結果中取出所有記錄 45 scroll() --游標滾動 46 47 ''' 48 49 #global var 50 #數據庫文件絕句路徑 51 DB_FILE_PATH = '' 52 #表名稱 53 TABLE_NAME = '' 54 #是否打印sql 55 SHOW_SQL = True 56 57 def get_conn(path): 58 '''獲取到數據庫的連接對象,參數為數據庫文件的絕對路徑 59 如果傳遞的參數是存在,並且是文件,那么就返回硬盤上面改 60 路徑下的數據庫文件的連接對象;否則,返回內存中的數據接 61 連接對象''' 62 conn = sqlite3.connect(path) 63 if os.path.exists(path) and os.path.isfile(path): 64 print('硬盤上面:[{}]'.format(path)) 65 return conn 66 else: 67 conn = None 68 print('內存上面:[:memory:]') 69 return sqlite3.connect(':memory:') 70 71 def get_cursor(conn): 72 '''該方法是獲取數據庫的游標對象,參數為數據庫的連接對象 73 如果數據庫的連接對象不為None,則返回數據庫連接對象所創 74 建的游標對象;否則返回一個游標對象,該對象是內存中數據 75 庫連接對象所創建的游標對象''' 76 if conn is not None: 77 return conn.cursor() 78 else: 79 return get_conn('').cursor() 80 81 ############################################################### 82 #### 創建|刪除表操作 START 83 ############################################################### 84 def drop_table(conn, table): 85 '''如果表存在,則刪除表,如果表中存在數據的時候,使用該 86 方法的時候要慎用!''' 87 if table is not None and table != '': 88 sql = 'DROP TABLE IF EXISTS ' + table 89 if SHOW_SQL: 90 print('執行sql:[{}]'.format(sql)) 91 cu = get_cursor(conn) 92 cu.execute(sql) 93 conn.commit() 94 print('刪除數據庫表[{}]成功!'.format(table)) 95 close_all(conn, cu) 96 else: 97 print('the [{}] is empty or equal None!'.format(sql)) 98 99 def create_table(conn, sql): 100 '''創建數據庫表:student''' 101 if sql is not None and sql != '': 102 cu = get_cursor(conn) 103 if SHOW_SQL: 104 print('執行sql:[{}]'.format(sql)) 105 cu.execute(sql) 106 conn.commit() 107 print('創建數據庫表[student]成功!') 108 close_all(conn, cu) 109 else: 110 print('the [{}] is empty or equal None!'.format(sql)) 111 112 ############################################################### 113 #### 創建|刪除表操作 END 114 ############################################################### 115 116 def close_all(conn, cu): 117 '''關閉數據庫游標對象和數據庫連接對象''' 118 try: 119 if cu is not None: 120 cu.close() 121 finally: 122 if cu is not None: 123 cu.close() 124 125 ############################################################### 126 #### 數據庫操作CRUD START 127 ############################################################### 128 129 def save(conn, sql, data): 130 '''插入數據''' 131 if sql is not None and sql != '': 132 if data is not None: 133 cu = get_cursor(conn) 134 for d in data: 135 if SHOW_SQL: 136 print('執行sql:[{}],參數:[{}]'.format(sql, d)) 137 cu.execute(sql, d) 138 conn.commit() 139 close_all(conn, cu) 140 else: 141 print('the [{}] is empty or equal None!'.format(sql)) 142 143 def fetchall(conn, sql): 144 '''查詢所有數據''' 145 if sql is not None and sql != '': 146 cu = get_cursor(conn) 147 if SHOW_SQL: 148 print('執行sql:[{}]'.format(sql)) 149 cu.execute(sql) 150 r = cu.fetchall() 151 if len(r) > 0: 152 for e in range(len(r)): 153 print(r[e]) 154 else: 155 print('the [{}] is empty or equal None!'.format(sql)) 156 157 def fetchone(conn, sql, data): 158 '''查詢一條數據''' 159 if sql is not None and sql != '': 160 if data is not None: 161 #Do this instead 162 d = (data,) 163 cu = get_cursor(conn) 164 if SHOW_SQL: 165 print('執行sql:[{}],參數:[{}]'.format(sql, data)) 166 cu.execute(sql, d) 167 r = cu.fetchall() 168 if len(r) > 0: 169 for e in range(len(r)): 170 print(r[e]) 171 else: 172 print('the [{}] equal None!'.format(data)) 173 else: 174 print('the [{}] is empty or equal None!'.format(sql)) 175 176 def update(conn, sql, data): 177 '''更新數據''' 178 if sql is not None and sql != '': 179 if data is not None: 180 cu = get_cursor(conn) 181 for d in data: 182 if SHOW_SQL: 183 print('執行sql:[{}],參數:[{}]'.format(sql, d)) 184 cu.execute(sql, d) 185 conn.commit() 186 close_all(conn, cu) 187 else: 188 print('the [{}] is empty or equal None!'.format(sql)) 189 190 def delete(conn, sql, data): 191 '''刪除數據''' 192 if sql is not None and sql != '': 193 if data is not None: 194 cu = get_cursor(conn) 195 for d in data: 196 if SHOW_SQL: 197 print('執行sql:[{}],參數:[{}]'.format(sql, d)) 198 cu.execute(sql, d) 199 conn.commit() 200 close_all(conn, cu) 201 else: 202 print('the [{}] is empty or equal None!'.format(sql)) 203 ############################################################### 204 #### 數據庫操作CRUD END 205 ############################################################### 206 207 208 ############################################################### 209 #### 測試操作 START 210 ############################################################### 211 def drop_table_test(): 212 '''刪除數據庫表測試''' 213 print('刪除數據庫表測試...') 214 conn = get_conn(DB_FILE_PATH) 215 drop_table(conn, TABLE_NAME) 216 217 def create_table_test(): 218 '''創建數據庫表測試''' 219 print('創建數據庫表測試...') 220 create_table_sql = '''CREATE TABLE `student` ( 221 `id` int(11) NOT NULL, 222 `name` varchar(20) NOT NULL, 223 `gender` varchar(4) DEFAULT NULL, 224 `age` int(11) DEFAULT NULL, 225 `address` varchar(200) DEFAULT NULL, 226 `phone` varchar(20) DEFAULT NULL, 227 PRIMARY KEY (`id`) 228 )''' 229 conn = get_conn(DB_FILE_PATH) 230 create_table(conn, create_table_sql) 231 232 def save_test(): 233 '''保存數據測試...''' 234 print('保存數據測試...') 235 save_sql = '''INSERT INTO student values (?, ?, ?, ?, ?, ?)''' 236 data = [(1, 'Hongten', '男', 20, '廣東省廣州市', '13423****62'), 237 (2, 'Tom', '男', 22, '美國舊金山', '15423****63'), 238 (3, 'Jake', '女', 18, '廣東省廣州市', '18823****87'), 239 (4, 'Cate', '女', 21, '廣東省廣州市', '14323****32')] 240 conn = get_conn(DB_FILE_PATH) 241 save(conn, save_sql, data) 242 243 def fetchall_test(): 244 '''查詢所有數據...''' 245 print('查詢所有數據...') 246 fetchall_sql = '''SELECT * FROM student''' 247 conn = get_conn(DB_FILE_PATH) 248 fetchall(conn, fetchall_sql) 249 250 def fetchone_test(): 251 '''查詢一條數據...''' 252 print('查詢一條數據...') 253 fetchone_sql = 'SELECT * FROM student WHERE ID = ? ' 254 data = 1 255 conn = get_conn(DB_FILE_PATH) 256 fetchone(conn, fetchone_sql, data) 257 258 def update_test(): 259 '''更新數據...''' 260 print('更新數據...') 261 update_sql = 'UPDATE student SET name = ? WHERE ID = ? ' 262 data = [('HongtenAA', 1), 263 ('HongtenBB', 2), 264 ('HongtenCC', 3), 265 ('HongtenDD', 4)] 266 conn = get_conn(DB_FILE_PATH) 267 update(conn, update_sql, data) 268 269 def delete_test(): 270 '''刪除數據...''' 271 print('刪除數據...') 272 delete_sql = 'DELETE FROM student WHERE NAME = ? AND ID = ? ' 273 data = [('HongtenAA', 1), 274 ('HongtenCC', 3)] 275 conn = get_conn(DB_FILE_PATH) 276 delete(conn, delete_sql, data) 277 278 ############################################################### 279 #### 測試操作 END 280 ############################################################### 281 282 def init(): 283 '''初始化方法''' 284 #數據庫文件絕句路徑 285 global DB_FILE_PATH 286 DB_FILE_PATH = 'c:\\test\\hongten.db' 287 #數據庫表名稱 288 global TABLE_NAME 289 TABLE_NAME = 'student' 290 #是否打印sql 291 global SHOW_SQL 292 SHOW_SQL = True 293 print('show_sql : {}'.format(SHOW_SQL)) 294 #如果存在數據庫表,則刪除表 295 drop_table_test() 296 #創建數據庫表student 297 create_table_test() 298 #向數據庫表中插入數據 299 save_test() 300 301 302 def main(): 303 init() 304 fetchall_test() 305 print('#' * 50) 306 fetchone_test() 307 print('#' * 50) 308 update_test() 309 fetchall_test() 310 print('#' * 50) 311 delete_test() 312 fetchall_test() 313 314 if __name__ == '__main__': 315 main()
========================================================
More reading,and english is important.
I'm Hongten
大哥哥大姐姐,覺得有用打賞點哦!多多少少沒關系,一分也是對我的支持和鼓勵。謝謝。
Hongten博客排名在100名以內。粉絲過千。
Hongten出品,必是精品。
E | hongtenzone@foxmail.com B | http://www.cnblogs.com/hongten
========================================================