Python 操作 SQLite 資料庫

Rocky0429發表於2018-12-07

寫在之前

SQLite 是一個小型的關係型資料庫,它最大的特點在於不需要單獨的服務、零配置。我們在之前講過的兩個資料庫,不管是 MySQL 還是 MongoDB,都需要我們安裝。安裝之後,然後執行起來,其實這就相當於已經有一個相應的服務在跑著。

SQLite 與前面所說的兩個資料庫不同。首先Python 已經將相應的驅動模組作為了標準庫的一部分,只要是你安裝了 Python,就可以使用;再者它可以類似於操作檔案那樣來操作 SQLite 資料庫檔案。還有一點,SQLite 原始碼不受版許可權制。

建立連線

SQLite 也是一個關係型資料庫,所以 SQL 可以直接在裡面使用。由於 SQLite 的驅動已經在 Python 裡面了,所以只要引用就可以直接使用,由於我們之前已經講過 MySQL 了,所以對於本次內容理解起來就容易多了。

>>> import sqlite3
>>> conn = sqlite3.connect(`lite.db`)

由上面的程式碼我們得到了連線物件,是不是覺得比 MySQL 連線要簡單很多呢?在 sqlite3.connect(`lite.db`) 中,如果已經有了那個資料庫,就直接連線它,如果沒有的話,就會自動建一個。需要注意的是,這裡的路徑是可以隨意指定的。

下面的程式碼顯示的是連線物件的屬性和方法:

>>> dir(conn)
[`DataError`, `DatabaseError`, `Error`, `IntegrityError`, `InterfaceError`, `InternalError`, `NotSupportedError`, `OperationalError`, `ProgrammingError`, `Warning`, `__call__`, `__class__`, `__delattr__`, `__dir__`, `__doc__`, `__enter__`, `__eq__`, `__exit__`, `__format__`, `__ge__`, `__getattribute__`, `__gt__`, `__hash__`, `__init__`, `__init_subclass__`, `__le__`, `__lt__`, `__ne__`, `__new__`, `__reduce__`, `__reduce_ex__`, `__repr__`, `__setattr__`, `__sizeof__`, `__str__`, `__subclasshook__`, `close`, `commit`, `create_aggregate`, `create_collation`, `create_function`, `cursor`, `execute`, `executemany`, `executescript`, `in_transaction`, `interrupt`, `isolation_level`, `iterdump`, `rollback`, `row_factory`, `set_authorizer`, `set_progress_handler`, `set_trace_callback`, `text_factory`, `total_changes`]

建立遊標

這一步其實跟 MySQL 也很類似,連線了資料庫之後,要建立遊標物件:

>>> cur = conn.cursor()

接下來就是對資料庫內容的操作,都是用遊標物件方法來實現:

>>> dir(cur)
[`__class__`, `__delattr__`, `__dir__`, `__doc__`, `__eq__`, `__format__`, `__ge__`, `__getattribute__`, `__gt__`, `__hash__`, `__init__`, `__init_subclass__`, `__iter__`, `__le__`, `__lt__`, `__ne__`, `__new__`, `__next__`, `__reduce__`, `__reduce_ex__`, `__repr__`, `__setattr__`, `__sizeof__`, `__str__`, `__subclasshook__`, `arraysize`, `close`, `connection`, `description`, `execute`, `executemany`, `executescript`, `fetchall`, `fetchmany`, `fetchone`, `lastrowid`, `row_factory`, `rowcount`, `setinputsizes`, `setoutputsize`]

我們在裡面看到了一系列我們熟悉的名稱:close()、execute()、fetchall() 等。

1.建立資料庫表

面對 SQLite 資料庫,我們之前熟悉的 SQL 指令都可以用:

>>> create_table = "create table books (title,author,language)"
>>> cur.execute(create_table)
<sqlite3.Cursor object at 0x104f296c0>

這樣就在資料庫 lite.db 中建立了一個表 books。對這個表可以增加資料:

>>> cur.execute(`insert into books values("python basic","rocky","python")`)
<sqlite3.Cursor object at 0x104f296c0>

為了保證資料能夠儲存,還要進行如下操作:

>>> conn.commit()
>>> cur.close()
>>> conn.close()

以上,在剛才建立的資料庫中已經有了一個表 books,表中已經有了一條記錄。

2.查詢

儲存以後我們來查詢一下:

>>> conn = sqlite3.connect(`lite.db`)
>>> cur = conn.cursor()
>>> cur.execute(`select * from books`)
<sqlite3.Cursor object at 0x104f297a0>
>>> cur.fetchall()
[(`python basic`, `rocky`, `python`)]

3.批量插入

我們來給 books 表中多增加一些內容,以便於我們進行其它的操作:

>>> books = [("first book","first","c"),("second book","second","c++"),("third book","third","java")]

這次我們來一個批量插入:

>>> cur.executemany(`insert into books values (?,?,?)`,books)
<sqlite3.Cursor object at 0x104f297a0>
>>> conn.commit()

接下來我們用迴圈語句來列印一下查詢結果:

>>> rows = cur.execute(`select * from books`)
>>> for row in rows:
...     print(row)
... 
(`python basic`, `rocky`, `python`)
(`first book`, `first`, `c`)
(`second book`, `second`, `c++`)
(`third book`, `third`, `java`)

4.更新

正如我們前面所說的,在 cur.execute() 中,可以寫 SQL 語句來運算元據庫:

>>> cur.execute("update books set title=`physics` where author=`first`")
<sqlite3.Cursor object at 0x104f297a0>
>>> conn.commit()

接下來我們按照條件查詢來看一看:

>>> cur.execute("select * from books where author=`first`")
<sqlite3.Cursor object at 0x104f297a0>
>>> cur.fetchall()
[(`physics`, `first`, `c`)]

5.刪除

刪除也是運算元據庫必須的動作:

>>> cur.execute("select * from books")
<sqlite3.Cursor object at 0x104f297a0>
>>> cur.fetchall()
[(`python basic`, `rocky`, `python`), (`physics`, `first`, `c`), (`third book`, `third`, `java`)]

最後不要忘記在完成對資料庫的操作以後,一定記得給人家「關上門」:

>>> cur.close()
>>> conn.close()

寫在之後

基本的知識差不多就是這些,當然肯定不侷限於此。在實際的程式設計中我們肯定會遇到很多的問題,大家記得要多多去查閱官方文件,學會解決問題。

更多內容,歡迎關注公眾號「Python空間」,期待和你的交流。

相關文章