日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

用Python进行SQLite数据库操作

發(fā)布時間:2025/6/15 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Python进行SQLite数据库操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡單的介紹

??????SQLite數(shù)據(jù)庫是一款非常小巧的嵌入式開源數(shù)據(jù)庫軟件,也就是說沒有獨立的維護進程,所有的維護都來自于程序本身。它是遵守ACID的關聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的設計目標是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百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.導入Python SQLITE數(shù)據(jù)庫模塊

?????Python2.5之后,內(nèi)置了SQLite3,成為了內(nèi)置模塊,這給我們省了安裝的功夫,只需導入即可~

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()--事務提交? ?
  • rollback()--事務回滾? ?
  • close()--關閉一個數(shù)據(jù)庫連接? ?
  • cursor()--創(chuàng)建一個游標
  • ??? 關于commit(),如果isolation_level隔離級別默認,那么每次對數(shù)據(jù)庫的操作,都需要使用該命令,你也可以設置isolation_level=None,這樣就變?yōu)樽詣犹峤荒J健?/p>

    ?

    4.使用游標查詢數(shù)據(jù)庫?

    ??? 我們需要使用游標對象SQL語句查詢數(shù)據(jù)庫,獲得查詢對象。 通過以下方法來定義一個游標。

    cu=cx.cursor()

    ?

    游標對象有以下的操作:
  • execute()--執(zhí)行sql語句? ?
  • executemany--執(zhí)行多條sql語句? ?
  • close()--關閉游標? ?
  • fetchone()--從結(jié)果中取一條記錄,并將游標指向下一條記錄? ?
  • fetchmany()--從結(jié)果中取多條記錄? ?
  • fetchall()--從結(jié)果中取出所有記錄? ?
  • scroll()--游標滾動 ?
  • 1. 建表

    cu.execute("create?table?catalog?(id?integer?primary?key,pid?integer,name?varchar(10)?UNIQUE,nickname?text?NULL)")

    上面語句創(chuàng)建了一個叫catalog的表,它有一個主鍵id,一個pid,和一個name,name是不可以重復的,以及一個nickname默認為NULL。

    ?

    2. 插入數(shù)據(jù)?

    請注意避免以下寫法:

    #?Never?do?this?--?insecure?會導致注入攻擊

    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來進行提交commit和回滾rollback操作.
    cx.commit()

    ?

    3.查詢

    cu.execute("select?*?from?catalog")?

    要提取查詢到的數(shù)據(jù),使用游標的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)默認編碼是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對象的詳細介紹

    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

    ?使用列的關鍵詞查詢

    In?[43]:?r['id']
    Out[
    43]:?0

    In?[
    44]:?r['name']
    Out[
    44]:?u'\u9c7c'

    ?

    ?

    ?

    ?


    ?



    ---我是低調(diào)的不顯眼的簡潔的不會被敵人發(fā)現(xiàn)的分割線---

    總結(jié)

    以上是生活随笔為你收集整理的用Python进行SQLite数据库操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。