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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转:pysqlite笔记

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转:pysqlite笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是一篇老筆記,原來是放在舊博客上 的,最近因為公司內部一個小東西,想使用簡單點的數據庫來存儲數據,就想起用SQLite來做,上網搜索一些教程。竟然發現,原來一年多前,我也學過一陣 子,可惜因為不常用,現在已經基本忘記光光了,加上自己對數據庫向來不是非常熟悉,就特地放到新博客上,順便回顧一下。

這篇筆記的主要內容來源于python之sqlite3使用詳解和PySqlite簡明教程。

SQlite這個小型數據庫,經常在Firefox或者其它軟件中看到,它貌似沒有獨立的維護進程,而是把所有數據都存放在一個單獨的文件中。上網搜了下資料,看了看Python上的pysqlite模塊,它正是Python中對sqlite的封裝實現。

數據庫操作

Python的數據庫模塊都有統一的接口標準,所以數據庫操作都基本上是統一的,基本上分成以下幾步(假設數據庫模塊為db):

  • 用db.connect()創建數據庫連接,連接對象為conn。
  • 如果不需要返回查詢結果,就直接調用conn.execute()。
  • 如果需要返回查詢結果,則需要首先通過conn.cursor()創建游標對象cur,并使用cur.fetchone()等函數獲取查詢結果。
  • 根據數據庫隔離級別的不同,修改數據庫后,可能需要使用conn.commit()手動提交事務。
  • 調用相應的close()方法關閉cur及conn。
  • 更加詳細的數據庫操作API可以參考Python的官方文檔:點擊這里。

    PySqlite基本操作

    1. 首先導入sqlite3模塊

    import sqlite3

    2. 接著創建數據庫鏈接

    conn = sqlite3.connect('test.db')

    其中"test.db"是數據庫的名稱,如果數據庫文件不存在,就會自動創建;否則,就打開指定的數據庫文件,同時創建一個數據庫連接對象,該對象主要有以下操作:

    • commit(): 事務提交
    • rollback(): 事務回滾
    • close(): 關閉一個數據庫連接
    • cursor(): 創建一個游標

    其中,commit()方法用于提交事務,rollback()方法用于回滾至上次調用commit()方法的地方。可以通過Connection.isolation_level定義事務隔離級別,當該屬性設置成None時,它會自動提交事務,不需要顯式地調用commit()方法。

    除了直接指定數據庫文件之外,還有一種方法是在內存中創建數據庫。方法是將":memory:"作為參數傳遞給sqlite.connect()函數:

    conn = sqlite3.connect(":memory:")

    3. 接下來就需要創建游標對象

    cur = conn.cursor()

    從網上找到一個關于游標的具體解釋(來源):

    游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每 次提取一條記錄的機制。游標總是與一條SQL 選擇語句相關聯。因為游標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的游標位置組成。當決定對結果集進行處 理時,必須聲明一個指向該結果集的游標。

    游標對象主要包含以下方法:

    • execute(): 執行sql語句
    • executemany(): 執行多條sql語句
    • close(): 關閉游標
    • fetchone(): 從結果中取一條記錄
    • fetchmany(): 從結果中取多條記錄
    • fetchall(): 從結果中取出所有記錄

    注:為了提高編程效率,PySqlite中的Connection對象同樣包含execute()等函數,通過使用這些函數,可以避免創建游標對象,具體可以參考PySqlite的文檔說明:點擊這里,下面的例子來自前面的文檔,介紹如何使用這些方法:

    import sqlite3persons = [ ("Hugo", "Boss"), ("Calvin", "Klein") ] con = sqlite3.connect(":memory:") # Create the table con.execute("create table person(firstname, lastname)") # Fill the table (這里使用PySqlite提供的占用符格式,提高安全性) con.executemany("insert into person(firstname, lastname) values (?, ?)", persons) # Print the table contents (使用迭代的方法獲取查詢結果) # con.execute(..)方法返回游標對象,避免手動創建游標對象。 for row in con.execute("select firstname, lastname from person"): print row print "I just deleted", con.execute("delete from person").rowcount, "rows"

    4. 通過execute()方法執行一條sql語句

    SQLite中sql語句在語法格式,參考這里。

    例如使用create table創建數據庫表格:

    cur.execute('''create table stocks ( date text, trans text, symbol text, qty real, price real)''')

    表格創建之后,可以使用insert語句插入數據:

    cur.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")

    5. 提交事務

    conn.commit()

    6. 關閉游標及數據庫鏈接,釋放資源

    cur.close() conn.close()

    PySqlite其它操作

    在執行插入語句的時候,經常需要使用腳本中定義的變量,PySqlite中提供了多種形式的占位符,可以方便進行變量替換,提高安全性。

    例如,回到之前插入的步驟:

    cur.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")

    在這里,使用的是字符串sql語句的形式,如果我們需要更改一些數據,就不得不重新寫一次,這樣一來可重用性就大大降低了。因此,Python提供 了一種機制,可以使用Python中的變量來代替sql字符串語句中的特定占位符。而對具體的語法,可以通過查詢DB模塊的paramstyle參數來訪 問,以下是幾種類型的語法說明:

    'qmark': Question mark style, e.g. '...WHERE name=?' 'numeric': Numeric, positional style, e.g. '...WHERE name=:1' 'named': Named style, e.g. '...WHERE name=:name' 'format': ANSI C printf format codes, e.g. '...WHERE name=%s' 'pyformat': Python extended format codes, e.g. '...WHERE name=%(name)s'

    關于如何使用,可以參考這篇博客python 數據庫查詢參數風格。當然Python自帶的文檔中也有講如何使用,也可以參考它。

    目前PySqlite支持qmark和named兩種形式。例如使用qmark形式,并且以元組(tuple)的形式作為第二個參數傳遞給execute函數:

    t = ('2006-01-05','BUY','RHAT',100,35.14) cur.execute("insert into stocks values(?,?,?,?,?)", t)

    當需要更多的數據的時候,這種方法就方便多了:

    for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00)]: cur.execute('insert into stocks values (?,?,?,?,?)', t)

    或者也可以使用executemany()方法來實現,該方法的第二個參數是一個序列或者迭代器,然后根據第一個參數指定的sql語句依次替換執行。上面的插入例子可以寫成:

    param_seq = [ ('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00) ] cur.executemany('insert into stocks values (?,?,?,?,?)', param_seq)

    那么還有一種需求是,一次性執行多條sql語句,就好比在mysql的一些圖形化界面中輸入多條sql語句,然后點擊執行,在PySqlite中可以通過executescript()方法來完成這個任務,例如(例子來源于官方文檔):

    cur.executescript(""" create table person( firstname, lastname, age ); create table book( title, author, published ); insert into book(title, author, published) values ( 'Dirk Gently''s Holistic Detective Agency', 'Douglas Adams', 1987 ); """)

    SQLite筆記

    1. 如何確定數據庫中是否存在某個表
    在SQLite中存在一張特殊的表SQLITE_MASTER,它是只讀的,該表的定義語句如下所示:

    CREATE TABLE sqlite_master (type TEXT, name TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT );

    其中,對于Table來說,type值為"table",而name為數據庫的表名稱。那么查詢數據庫中所有的表,可以使用下面的方法:

    SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;

    相應的如果,要查找是否存在表stocks可以這樣做:

    SELECT count(*) FROM sqlite_master where name='stocks' and type='table';

    返回1則代表存在,0則表示不存在。

    參考:http://sqlite.org/faq.html#q7

    轉載于:https://www.cnblogs.com/alecyrus/p/4809773.html

    總結

    以上是生活随笔為你收集整理的转:pysqlite笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。