溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python中怎么使用sqlite3數(shù)據(jù)庫

發(fā)布時間:2021-08-03 17:03:04 來源:億速云 閱讀:183 作者:Leah 欄目:數(shù)據(jù)庫

python中怎么使用sqlite3數(shù)據(jù)庫,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

Python SQLITE數(shù)據(jù)庫是一款非常小巧的嵌入式開源數(shù)據(jù)庫軟件,也就是說沒有獨立的維護(hù)進(jìn)程,所有的維護(hù)都來自于程序本身。它使用一個文件存儲整個數(shù)據(jù)庫,操作十分方便。它的最大優(yōu)點是使用方便,功能相比于其它大型數(shù)據(jù)庫來說,確實有些差距。但是性能表現(xiàn)上,SQLITE并不遜色。麻雀雖小,五臟俱全, sqlite 實現(xiàn)了多數(shù) sql-92 的標(biāo)準(zhǔn),比如說 transaction 、 trigger 和復(fù)雜的查詢等。

python的數(shù)據(jù)庫模塊有統(tǒng)一的接口標(biāo)準(zhǔn),所以數(shù)據(jù)庫操作都有統(tǒng)一的模式,基本上都是下面幾步(假設(shè)數(shù)據(jù)庫模塊名為db):

1. 用db.connect創(chuàng)建數(shù)據(jù)庫連接,假設(shè)連接對象為conn
2. 如果該數(shù)據(jù)庫操作不需要返回結(jié)果,就直接用conn.execute查詢,根據(jù)數(shù)據(jù)庫事務(wù)隔離級別的不同,可能修改數(shù)據(jù)庫需要conn.commit
3. 如果需要返回查詢結(jié)果則用conn.cursor創(chuàng)建游標(biāo)對象cur, 通過cur.execute查詢數(shù)據(jù)庫,用cur.fetchall/cur.fetchone/cur.fetchmany返回查詢結(jié)果。根據(jù)數(shù)據(jù)庫事 務(wù)隔離級別的不同,可能修改數(shù)據(jù)庫需要conn.commit
4. 關(guān)閉cur, conn

下面讓我們一步步走進(jìn)Python中的SQLite吧。

一,Python SQLITE數(shù)據(jù)庫導(dǎo)入模塊:

import sqlite3

二,創(chuàng)建數(shù)據(jù)庫/打開數(shù)據(jù)庫:

cx = sqlite3.connect("E:/test.db") 其實我們不需要顯式的創(chuàng)建一個sqlite數(shù)據(jù)庫,在調(diào)用connect函數(shù)的時候,指定庫名稱,如果指定的數(shù)據(jù)庫存在就直接打開這個數(shù)據(jù)庫,如果不存在就新創(chuàng)建一個再打開。這一點應(yīng)用很好理解。

三,數(shù)據(jù)庫連接對象:

打開數(shù)據(jù)庫時返回的對象cx就是一個數(shù)據(jù)庫連接對象,它可以有以下操作:

commit()--事務(wù)提交   rollback()--事務(wù)回滾   close()--關(guān)閉一個數(shù)據(jù)庫連接   cursor()--創(chuàng)建一個游標(biāo)

四,Python SQLITE數(shù)據(jù)庫游標(biāo)的使用:

游標(biāo)提供了一種對從表中檢索出的數(shù)據(jù)進(jìn)行操作的靈活手段,就本質(zhì)而言,游標(biāo)實際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機制。游標(biāo)總是與一條SQL  選擇語句相關(guān)聯(lián)。因為游標(biāo)由結(jié)果集(可以是零條、一條或由相關(guān)的選擇語句檢索出的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。當(dāng)決定對結(jié)果集進(jìn)行處理時,必須聲明一個指向該結(jié)果集的游標(biāo)。如果曾經(jīng)用
C 語言寫過對文件進(jìn)行處理的程序,那么游標(biāo)就像您打開文件所得到的文件句柄一樣,只要文件打開成功, 該文件句柄就可代表該文件。對于游標(biāo)而言,其道理是相同的??梢娪螛?biāo)能夠?qū)崿F(xiàn)按與傳統(tǒng)程序讀取平面文件類似的方式處理來自基礎(chǔ)表的結(jié)果集,從而把表中數(shù)據(jù)以平面文件的形式呈現(xiàn)給程序。
        我們知道關(guān)系數(shù)據(jù)庫管理系統(tǒng)實質(zhì)是面向集合的,在Sqlite中并沒有一種描述表中單一記錄的表達(dá)形式,除非使用where  子句來限制只有一條記錄被選中。因此我們必須借助于游標(biāo)來進(jìn)行面向單條記錄的數(shù)據(jù)處理。由此可見,游標(biāo)允許應(yīng)用程序?qū)Σ樵冋Z句select  返回的行結(jié)果集中每一行進(jìn)行相同或不同的操作,而不是一次對整個結(jié)果集進(jìn)行同一種操作;它還提供對基于游標(biāo)位置而對表中數(shù)據(jù)進(jìn)行刪除或更新的能力;正是游標(biāo)把作為面向集合的數(shù)據(jù)庫管理系統(tǒng)和面向行的程序設(shè)計兩者聯(lián)系起來,使兩個數(shù)據(jù)處理方式能夠進(jìn)行溝通。

下面著重闡述cursor游標(biāo)的使用。其實,所有sql語句的執(zhí)行都要在游標(biāo)對象下進(jìn)行。

首先,定義一個游標(biāo):

cu = cx.cursor() 這樣定義了一個游標(biāo)。游標(biāo)對象有以下的操作:

execute()--執(zhí)行sql語句   executemany--執(zhí)行多條sql語句   close()--關(guān)閉游標(biāo)   fetchone()--從結(jié)果中取一條記錄,并將游標(biāo)指向下一條記錄   fetchmany()--從結(jié)果中取多條記錄   fetchall()--從結(jié)果中取出所有記錄   scroll()--游標(biāo)滾動 下面就使用Python SQLITE數(shù)據(jù)庫中游標(biāo)對我們上面建立的數(shù)據(jù)庫作一些操作吧:

1,建表:
cu.execute('create table catalog (id integer primary key,pid integer,name varchar(10) UNIQUE)') 上面語句創(chuàng)建了一個叫catalog的表,它有一個主鍵id,一個pid,和一個name,name是不可以重復(fù)的。

2,插入數(shù)據(jù):
cu.execute("insert into catalog values(0, 0, 'name1')")  cu.execute("insert into catalog values(1, 0, 'hello')") 簡單的插入兩行數(shù)據(jù),不過需要提醒的是,只有提交了之后,才能生效.我們使用數(shù)據(jù)庫連接對象cx來進(jìn)行提交commit和回滾rollback操作.
cx.commit()

3,查詢:
cu.execute("select * from catalog") 要提取查詢到的數(shù)據(jù),使用游標(biāo)的fetch***函數(shù),如:
print cu.fetchall() 返回結(jié)果如下:
[(0, 0, u'name1'), (1, 0, u'hello')] 如果我們使用cu.fetchone(),則首先返回列表中的第一項,再次使用,則返回第二項,依次下去.

4,修改:
cu.execute("update catalog set name='name2' where id = 0") 

cx.commit() 注意,修改數(shù)據(jù)以后提交

5,刪除:
cu.execute("delete from catalog where id = 1")  cx.commit() 以上簡單的操作反應(yīng)的Python SQLITE數(shù)據(jù)庫操作的基本要點,這里點到為止.然后,SQLite的強大,并不僅限于此,其對SQL高級特性的支持及其小巧靈活的特點,使得SQLite在眾多領(lǐng)域受到開發(fā)者的青睞.

舉例:

 Exemplary exemplar 1

import sqlite3

con = sqlite3.connect('d:/mydatabase.db3')
cur = con.cursor()
cur.execute('CREATE TABLE foo (o_id INTEGER PRIMARY KEY, fruit VARCHAR(20), veges VARCHAR(30))')
con.commit()
cur.execute('INSERT INTO foo (o_id, fruit, veges) VALUES(NULL, "apple", "broccoli")')
con.commit()
print cur.lastrowid

cur.execute('SELECT * FROM foo')
print cur.fetchall()

  Exemplary exemplar 2

#-*- encoding:gb2312 -*-
import sqlite3

conn = sqlite3.connect("D:/aaa.db")
conn.isolation_level = None #這個就是事務(wù)隔離級別,默認(rèn)是需要自己commit才能修改數(shù)據(jù)庫,置為None則自動每次修改都提交,否則為""
# 下面就是創(chuàng)建一個表
conn.execute("create table if not exists t1(id integer primary key autoincrement, name varchar(128), info varchar(128))")
# 插入數(shù)據(jù)
conn.execute("insert into t1(name,info) values ('zhaowei', 'only a test')")
# 如果隔離級別不是自動提交就需要手動執(zhí)行commit
conn.commit()
# 獲取到游標(biāo)對象
cur = conn.cursor()
# 用游標(biāo)來查詢就可以獲取到結(jié)果
cur.execute("select * from t1")
# 獲取所有結(jié)果
res = cur.fetchall()
print 'row:', cur.rowcount
# cur.description是對這個表結(jié)構(gòu)的描述
print 'desc', cur.description
# 用fetchall返回的結(jié)果是一個二維的列表
for line in res:
    for f in line:
        print f,
    print
print '-'*60

cur.execute("select * from t1")
# 這次查詢后只取一個結(jié)果,就是一維列表
res = cur.fetchone()
print 'row:', cur.rowcount
for f in res:
    print f,
print
# 再取一行
res = cur.fetchone()
print 'row:', cur.rowcount
for f in res:
    print f,
print
print '-'*60


cur.close()
conn.close()

看完上述內(nèi)容,你們掌握python中怎么使用sqlite3數(shù)據(jù)庫的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI