Python操作SQLite數(shù)據(jù)庫的方法詳解
本文實例講述了Python操作SQLite數(shù)據(jù)庫的方法。分享給大家供大家參考,具體如下:
SQLite簡單介紹
SQLite數(shù)據(jù)庫是一款非常小巧的嵌入式開源數(shù)據(jù)庫軟件,也就是說沒有獨立的維護進(jìn)程,所有的維護都來自于程序本身。它是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的設(shè)計目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結(jié)合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數(shù)據(jù)庫管理系統(tǒng)來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月. 至今已經(jīng)有10個年頭,SQLite也迎來了一個版本 SQLite 3已經(jīng)發(fā)布。
安裝與使用
1.導(dǎo)入Python SQLITE數(shù)據(jù)庫模塊
Python2.5之后,內(nèi)置了SQLite3,成為了內(nèi)置模塊,這給我們省了安裝的功夫,只需導(dǎo)入即可~
import sqlite3
2. 創(chuàng)建/打開數(shù)據(jù)庫
在調(diào)用connect函數(shù)的時候,指定庫名稱,如果指定的數(shù)據(jù)庫存在就直接打開這個數(shù)據(jù)庫,如果不存在就新創(chuàng)建一個再打開。
cx = sqlite3.connect("E:/test.db")
也可以創(chuàng)建數(shù)據(jù)庫在內(nèi)存中。
con = sqlite3.connect(":memory:")
3.數(shù)據(jù)庫連接對象
打開數(shù)據(jù)庫時返回的對象cx就是一個數(shù)據(jù)庫連接對象,它可以有以下操作:
① commit()--事務(wù)提交
② rollback()--事務(wù)回滾
③ close()--關(guān)閉一個數(shù)據(jù)庫連接
④ cursor()--創(chuàng)建一個游標(biāo)
關(guān)于commit(),如果isolation_level隔離級別默認(rèn),那么每次對數(shù)據(jù)庫的操作,都需要使用該命令,你也可以設(shè)置isolation_level=None,這樣就變?yōu)樽詣犹峤荒J健?/p>
4.使用游標(biāo)查詢數(shù)據(jù)庫
我們需要使用游標(biāo)對象SQL語句查詢數(shù)據(jù)庫,獲得查詢對象。 通過以下方法來定義一個游標(biāo)。
cu=cx.cursor()
游標(biāo)對象有以下的操作:
① execute()--執(zhí)行sql語句
② executemany--執(zhí)行多條sql語句
③ close()--關(guān)閉游標(biāo)
④ fetchone()--從結(jié)果中取一條記錄,并將游標(biāo)指向下一條記錄
⑤ fetchmany()--從結(jié)果中取多條記錄
⑥ fetchall()--從結(jié)果中取出所有記錄
⑦ scroll()--游標(biāo)滾動
1. 建表
上面語句創(chuàng)建了一個叫catalog的表,它有一個主鍵id,一個pid,和一個name,name是不可以重復(fù)的,以及一個nickname默認(rèn)為NULL。
2. 插入數(shù)據(jù)
請注意避免以下寫法:
# Never do this -- insecure 會導(dǎo)致注入攻擊 pid=200 c.execute("... where pid = '%s'" % pid)
正確的做法如下,如果t只是單個數(shù)值,也要采用t=(n,)的形式,因為元組是不可變的。
for t in[(0,10,'abc','Yu'),(1,20,'cba','Xu')]: cx.execute("insert into catalog values (?,?,?,?)", t)
簡單的插入兩行數(shù)據(jù),不過需要提醒的是,只有提交了之后,才能生效.我們使用數(shù)據(jù)庫連接對象cx來進(jìn)行提交commit和回滾rollback操作.
cx.commit()
3.查詢
cu.execute("select * from catalog")
要提取查詢到的數(shù)據(jù),使用游標(biāo)的fetch函數(shù),如:
In [10]: cu.fetchall() Out[10]: [(0, 10, u'abc', u'Yu'), (1, 20, u'cba', u'Xu')]
如果我們使用cu.fetchone(),則首先返回列表中的第一項,再次使用,則返回第二項,依次下去.
4.修改
In [12]: cu.execute("update catalog set name='Boy' where id = 0") In [13]: cx.commit()
注意,修改數(shù)據(jù)以后提交
5.刪除
cu.execute("delete from catalog where id = 1") cx.commit()
6.使用中文
請先確定你的IDE或者系統(tǒng)默認(rèn)編碼是utf-8,并且在中文前加上u
x=u'魚' cu.execute("update catalog set name=? where id = 0",x) cu.execute("select * from catalog") cu.fetchall() [(0, 10, u'\u9c7c', u'Yu'), (1, 20, u'cba', u'Xu')]
如果要顯示出中文字體,那需要依次打印出每個字符串
In [26]: for item in cu.fetchall(): ....: for element in item: ....: print element, ....: print ....: 0 10 魚 Yu 1 20 cba Xu
7.Row類型
Row提供了基于索引和基于名字大小寫敏感的方式來訪問列而幾乎沒有內(nèi)存開銷。 原文如下:
sqlite3.Row provides both index-based and case-insensitive name-based access to columns with almost no memory overhead. It will probably be better than your own custom dictionary-based approach or even a db_row based solution.
Row對象的詳細(xì)介紹
class sqlite3.Row
A Row instance serves as a highly optimized row_factory for Connection objects. It tries to mimic a tuple in most of its features.
It supports mapping access by column name and index, iteration, representation, equality testing and len().
If two Row objects have exactly the same columns and their members are equal, they compare equal.
Changed in version 2.6: Added iteration and equality (hashability).
keys()
This method returns a tuple of column names. Immediately after a query, it is the first member of each tuple in Cursor.description.
New in version 2.6.
下面舉例說明
In [30]: cx.row_factory = sqlite3.Row In [31]: c = cx.cursor() In [32]: c.execute('select * from catalog') Out[32]: <sqlite3.Cursor object at 0x05666680> In [33]: r = c.fetchone() In [34]: type(r) Out[34]: <type 'sqlite3.Row'> In [35]: r Out[35]: <sqlite3.Row object at 0x05348980> In [36]: print r (0, 10, u'\u9c7c', u'Yu') In [37]: len(r) Out[37]: 4 In [39]: r[2] #使用索引查詢 Out[39]: u'\u9c7c' In [41]: r.keys() Out[41]: ['id', 'pid', 'name', 'nickname'] In [42]: for e in r: ....: print e, ....: 0 10 魚 Yu
使用列的關(guān)鍵詞查詢
In [43]: r['id'] Out[43]: 0 In [44]: r['name'] Out[44]: u'\u9c7c'
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python常見數(shù)據(jù)庫操作技巧匯總》、《Python編碼操作技巧總結(jié)》、《Python圖片操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
- Python 如何操作 SQLite 數(shù)據(jù)庫
- Python連接SQLite數(shù)據(jù)庫并進(jìn)行增冊改查操作方法詳解
- Python操作SQLite/MySQL/LMDB數(shù)據(jù)庫的方法
- Python操作SQLite數(shù)據(jù)庫過程解析
- 利用python操作SQLite數(shù)據(jù)庫及文件操作詳解
- Python開發(fā)SQLite3數(shù)據(jù)庫相關(guān)操作詳解【連接,查詢,插入,更新,刪除,關(guān)閉等】
- Python操作SQLite數(shù)據(jù)庫的方法詳解【導(dǎo)入,創(chuàng)建,游標(biāo),增刪改查等】
- 使用Python對SQLite數(shù)據(jù)庫操作
- Python SQLite3數(shù)據(jù)庫操作類分享
- python操作數(shù)據(jù)庫之sqlite3打開數(shù)據(jù)庫、刪除、修改示例
- Python 操作SQLite數(shù)據(jù)庫的示例
相關(guān)文章
Python實現(xiàn)類似比特幣的加密貨幣區(qū)塊鏈的創(chuàng)建與交易實例
本文講解了Python實現(xiàn)類似比特幣的加密貨幣區(qū)塊鏈的創(chuàng)建與交易實例方法2018-03-03Python3.5基礎(chǔ)之NumPy模塊的使用圖文與實例詳解
這篇文章主要介紹了Python3.5基礎(chǔ)之NumPy模塊的使用,結(jié)合圖文與實例形式詳細(xì)分析了Python3.5中Numpy模塊的原理、功能、使用方法及操作注意事項,需要的朋友可以參考下2019-04-04python射線法判斷一個點在圖形區(qū)域內(nèi)外
這篇文章主要為大家詳細(xì)介紹了python射線法判斷一個點在圖形區(qū)域內(nèi)外,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法
今天小編就為大家分享一篇Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python中的np.setdiff1d()函數(shù)詳解
Python中的np.setdiff1d()函數(shù)可用于找出兩個序列集合中元素的差異,下面通過示例代碼給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧2024-06-06python 如何獲取頁面所有a標(biāo)簽下href的值
這篇文章主要介紹了python 獲取頁面所有a標(biāo)簽下href的值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05