# SQLite資料庫操作簡介

不需要安裝額外的資料庫管理程式或伺服器，只要一個檔案就可以使用的資料庫系統SQLite，是初學者和小型資料庫應用程式的最佳選擇，儘管嚴格來說它其實還不算是一個資料庫管理系統。&#x20;

SQLite是一個以檔案為基礎的非常精簡版的SQL資料庫管理系統，它的最主要特色是沒有外部的伺服器系統或是執行中的對應程式，所有的操作都內嵌在操作資料庫的應用程式中（也就是我們編寫的程式），對於Python來說，只要載入對應的模組即可立即上手使用。

建立資料庫可以在程式中以create table指令完成，也可以透過圖形化的介面操作，在此使用後者，請先到以下的網站下載並安裝DB Browser for SQLite：

{% embed url="<https://sqlitebrowser.org/dl/>" %}

執行的畫面如下：

![](https://1741776126-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LM_x5S3LUIkxgX_FiuL%2F-LdbC6sj-jmA7RFYdOUr%2F-LdbChT8FCN9DnAs75So%2F8-2-1.png?alt=media\&token=9e9f6a98-2924-40f5-906a-0e8b2c3923d9)

請在該介面中建立所需要的資料庫和資料表以供後續使用。建立完成之後的畫面如下所示：

![](https://1741776126-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LM_x5S3LUIkxgX_FiuL%2F-LdbC6sj-jmA7RFYdOUr%2F-LdbD49nLNtcKlEbB9Mj%2F8-2-3.png?alt=media\&token=fda62c20-f090-4555-a02c-1dabcd8a83d9)

也可以在此介面新增或編輯資料：

![](https://1741776126-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LM_x5S3LUIkxgX_FiuL%2F-LdbC6sj-jmA7RFYdOUr%2F-LdbDFteFZGS9A0FrHbe%2F8-2-6.png?alt=media\&token=e1ba4500-0c08-45a0-bae5-9e7a05892868)

接下來就可以使用以下的程式碼來存取資料庫內容：

```python
#顯示學生成績表
import sqlite3
dbfile = "school.db"
conn = sqlite3.connect(dbfile)
rows = conn.execute("select * from score;")
for row in rows:
    for field in row:
        print("{}\t".format(field), end="")
    print()
conn.close()

```

在Python中操作SQLite資料庫的標準步驟如下：

1. import sqlite3
2. 使用sqlite3.connect("資料庫檔案路徑")，它會傳回一個指標，習慣上會使用conn這個變數來接收它。
3. 利用前面所傳回的變數conn呼叫execute函數，函數中的內容就是SQL指令的字串。在execute執行之後，會傳回一個叫做Cursor的物件，它可以用來存取每一筆紀錄，也就是資料表中查詢結果的指標，由於會以列的型式來存取，因此習慣上在程式中會用rows或是cursor或是c這個變數來接收，在此程式例中是以rows來接收。
4. 接著，可以使用迴圈的方式把每一列找出來使用。

在上述的程式中，取出的rows就是查詢結果的所有紀錄，以列的型式來存放，而由於每一列中有許多的欄位（field），所以在上面的程式中使用了2層的迴圈，外層迴圈用來找出每一列，內層迴圈用來找出列中的每一欄。

```
1	A23001	80	98	34	55	67	
2	A23002	89	99	45	89	90	
3	A23003	89	90	87	88	90	
4	A23004	99	89	90	99	100	
5	A23005	89	56	88	90	52	
```

輸入成績並把它們儲存入資料庫的標準作法：

```python
import sqlite3
dbfile = "school.db"
conn = sqlite3.connect(dbfile)
stuno = input("學號：")
chi = input("國文成績：")
eng = input("英文成績：")
mat = input("數學成績：")
his = input("歷史成績：")
geo = input("地理成績：")
sql_str = "insert into score(stuno, chi, eng, mat, his, geo) values('{}',{},{},{},{},{});".format(stuno, chi, eng, mat, his, geo)
conn.execute(sql_str)
conn.commit()
conn.close()

```

設定以欄位名稱操作資料庫的程式設計標準步驟：

```python
import sqlite3
dbfile = "school.db"
conn = sqlite3.connect(dbfile)
conn.row_factory = sqlite3.Row
cur = conn.cursor()
cur.execute("select * from score;")
rows = cur.fetchall()
print(rows[0].keys())
print(type(rows))
print(type(rows[0]))
print("學號\t國文\t英文")
for row in rows:
    print("{}\t{}\t{}".format(row['stuno'], row['chi'], row['eng']))

```
