### 連接數據庫
從2.5版本開始,Python的標準庫中就有了一個專門用于SQLite的sqlite3模塊。連接SQLite數據庫方式如下:
~~~
import sqlite3 as dbapi
con = dbapi.connect('population.db')
cur = con.cursor()
~~~
第一個語句用于引用數據庫API;
第二個語句創建了一個到數據庫的連接(connection):調用數據庫模塊的connect方法。該方法的參數是一個字符串,它定義了我們所要連接的那個數據庫。由于SQLite是將整個數據庫保存在磁盤上的某個文件中的,因此這里就是該文件的路徑。如果該數據庫不存在,就會直接創建出來;
第三個語句用于獲取一個游標,它類似于文本編輯器中的光標,用于記錄我們當前在數據庫中的位置;當多個程序同時訪問數據庫時,該數據庫可以知道誰在干什么。
**數據類型對比**
| SQLite | Python | 說明 |
|-----|-----|-----|
| NULL | NontType | 啥也不知道 |
| INTEGER | int或long | 整數 |
| REAL | float | 8字節浮點數 |
| TEXT | unicode或str | 字符串 |
| BLOB | buffer | 二進制數據(Binary Large OBject) |
### 操作數據庫
現在我們就可以操作數據庫了,我們將要執行的SQL語句放到一個字符串中,并告訴數據庫去執行這個字符串,如下所示:
~~~
cur.execute('CREATE TABLE Student(Stuid TEXT, Age INTERGER, Name TEXT)')
cur.execute('INSERT INTO Student VALUES("00001", 20, "Lucy")')
cur.execute('INSERT INTO Student VALUES("00002", 21, "Lily")')
~~~
在將數據庫插入到數據庫或對數據庫做了任何其他修改之后,我們必須通過連接的commit方法提交(commit)這些修改:
~~~
con.commit()
~~~
現在我們可以用如下方式來獲取數據:
~~~
cur.execute('SELECT * FROM Student')
print(cur.fetchone())
print(cur.fetchall())
~~~
fetchone方法以**元組**的形式返回每條記錄,其中各元素按查詢所指定的順序排列。如果不再有其他記錄存在,則返回None。默認情況下,數據庫中的TEXT是以Unicode字符串的形式返回的,我們可以告訴sqlite3以str的類型返回字符串:將連接的text_factory成員設置為類型str。
~~~
con.text_factory = str
~~~
fetchall方法的功能是以元組列表的形式返回查詢所產生的全部數據。
一種較為快捷的插入方式:
~~~
ss = [("00003", 20, "David"), ("00004", 23, "Cneagle"),
("00005", 22, "qxzy")]
for s in ss:
cur.execute('INSERT INTO Student VALUES(?, ?, ?)', (s[0], s[1], s[2]))
con.commit()
~~~
這次execute的調用用到了兩個參數,第一個是帶有問號的SQL語句,這些問號是將要插入的值的占位符,第二個是由待插入值所組成的元組,數據庫在執行該語句時,會用這些值從左到右地替換那些問號。
注意:
- SQL的數據類型與編程語言中的數據類型并不完全相同,因此在編寫應用程序的時候很有必要在它們之間進行類型轉換。
- 在被提交之前,對數據庫做出的修改不會有任何效果。這保證了當數據庫被兩個以上的程序同時操作時,能夠保持一致的狀態。