转:pysqlite笔记
這是一篇老筆記,原來是放在舊博客上 的,最近因為公司內部一個小東西,想使用簡單點的數據庫來存儲數據,就想起用SQLite來做,上網搜索一些教程。竟然發現,原來一年多前,我也學過一陣 子,可惜因為不常用,現在已經基本忘記光光了,加上自己對數據庫向來不是非常熟悉,就特地放到新博客上,順便回顧一下。
這篇筆記的主要內容來源于python之sqlite3使用詳解和PySqlite簡明教程。
SQlite這個小型數據庫,經常在Firefox或者其它軟件中看到,它貌似沒有獨立的維護進程,而是把所有數據都存放在一個單獨的文件中。上網搜了下資料,看了看Python上的pysqlite模塊,它正是Python中對sqlite的封裝實現。
數據庫操作
Python的數據庫模塊都有統一的接口標準,所以數據庫操作都基本上是統一的,基本上分成以下幾步(假設數據庫模塊為db):
更加詳細的數據庫操作API可以參考Python的官方文檔:點擊這里。
PySqlite基本操作
1. 首先導入sqlite3模塊
import sqlite32. 接著創建數據庫鏈接
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,它是只讀的,該表的定義語句如下所示:
其中,對于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笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab函数建模例题,数学建模mat
- 下一篇: linux文件编程(2)——系统文件描述