一、資料庫程式設計介面
程式執行的時候,資料都是在記憶體中的。當程式終止的時候,通常都需要將資料儲存到磁碟上。為了便於程式儲存的讀取資料,並能直接透過條件查詢跨快速查詢指定的資料,就出現了資料庫(Database)這種專門用於集中儲存和查詢的軟體。
在 Python 中提供了資料庫連線物件,它提供了獲取資料庫遊標物件和提交/回滾事務的方法,以及如何關閉資料庫連線。
【1】、獲取連線物件
我們可以使用 connect() 函式獲取連線物件,該函式有多個引數,具體使用哪個引數,取決於使用的資料庫型別。connect() 方法返回連線物件,這個物件表示目前和資料庫的會話。連線物件支援的方法如下:
close() # 關閉資料庫連線
commit() # 提交當前事務
rollback() # 取消當前事務
cursor() # 使用該連線建立(並返回)一個遊標物件
【2】、獲取遊標物件
遊標物件代表資料庫中的遊標,用於指示抓取資料操作的上下文。主要提供執行 SQL 語句、呼叫儲存過程、獲取查詢結果等方法。我們可以透過使用連線物件的 cursor() 方法獲取遊標物件。
遊標物件的常用屬性如下:
arraysize # 使用fetchmany()方法時,一次取出的結果行數,預設為1
connection # 建立此遊標的連線
description # 返回遊標活動狀態(7項元組):(name,type_code,display_size,internal_size,precision,scale,null_ok),只有name和type_code是必須的
lastrowid # 上次修改行的ID,如果不支援行ID,則返回None
rowcount # 上次execute()方法處理或影響的行數
遊標物件的常用方法如下:
callproc(procname[,parameters]) # 呼叫儲存過程
close() # 關閉遊標
execute(operation[,parameters]) # 執行資料庫查詢或命令
executemany(operation,seq_of_params) # 批次執行資料庫查詢或命令
fetchone() # 獲取查詢結果集的下一條記錄
fetchmany(size) # 獲取指定數量的記錄
fetchall() # 獲取結果集的所有記錄
nextset() # 跳轉下一個可用的結果集(如果支援)
setinputsizes(sizes) # 設定在呼叫execute()方法是分配的記憶體區域大小
setoutputsize(sizes) # 設定列緩衝區大小
二、使用SQLite資料庫
與許多其它資料庫管理系統不同,SQLite 不是一個客戶端/伺服器結構的資料庫引擎,而是一種嵌入式資料庫,它的資料庫就是一個檔案。SQLite 將整個資料庫,包括定義、表、索引以及資料本身,作為一個單獨的、可跨平臺使用的檔案儲存在主機中。
由於 Python 中已經內建了 SQLite3,所以我們可以直接使用 import 語句匯入 SQLite3 模組,無需安裝任何其它的模組,可以直接使用。
import sqlite3
connection = sqlite3.connect("test.db") # 獲取連線
cursor = connection.cursor() # 獲取遊標
# 執行SQL語句,建立表
cursor.execute("create table if not exists user(name varchar(20), age int)")
# 向表中插入資料,新增使用者資訊
cursor.execute("insert into user(name,age) values('Sakura',10)")
cursor.execute("insert into user(name,age) values('Mikoto',14)")
cursor.execute("insert into user(name,age) values('Shana',15)")
# 執行查詢結果
cursor.execute("select * from user")
# 獲取查詢結果
result = cursor.fetchone() # 使用fetchone()獲取一條記錄
print(result,end="\n\n")
result = cursor.fetchmany(2) # 使用fetchmany()獲取多條記錄
print(result,end="\n\n")
result = cursor.fetchall() # 使用fetchall()獲取全部查詢結果
print(result,end="\n\n")
# 修改使用者資訊
# 使用問號作為佔位符代替具體的數值,然後使用一個元組來替代問號
# 使用佔位符的方式可以避免SQL隱碼攻擊的風險
cursor.execute("update user set age = ? where name = ?",(12,"Sakura"))
cursor.execute("select * from user where name = ?",("Sakura",))
result = cursor.fetchall()
print(result,end="\n\n")
# 刪除使用者資料
cursor.execute("delete from user where name = ?",("Shana",))
cursor.execute("select * from user")
result = cursor.fetchall()
print(result,end="\n\n")
cursor.close() # 關閉遊標
connection.close() # 關閉資料庫
三、使用MySQL資料庫
在 Python 中支援 MySQL 的資料庫模組有很多,這裡我們選擇使用 pymysql。我們可以在終端中使用 pip 命令安裝:
pip intall pymysql
在使用 pymysql 模組運算元據庫時,首先需要建立出資料庫。
CREATE DATABASE IF NOT EXISTS db_test CHARACTER SET utf8;
import pymysql
# 開啟資料庫連線
db = pymysql.connect(
user="root", # 使用者名稱
password="abc123", # 密碼
host="localhost", # 主機地址
port=3306, # 埠號
database="db_test", # 資料庫名
)
# 使用cursor()方法建立一個遊標物件cursor
cursor = db.cursor()
data = [
('Sakura',10),
('Mikoto',14),
('Shana',15),
]
try:
# 使用execute()方法,執行SQL語句,建立表
cursor.execute("create table if not exists user(name varchar(20), age int)")
# 向表中插入資料,新增使用者資訊
# 執行sql語句,插入多條記錄
# 不管欄位是什麼型別的,佔位符統一是%s
cursor.executemany("insert into user(name,age) values(%s,%s)",data)
db.commit() # 提交資料
except:
db.rollback() # 發生錯誤時回滾
# 執行查詢結果
cursor.execute("select * from user")
# 獲取查詢結果
result = cursor.fetchone() # 使用fetchone()獲取一條記錄
print(result,end="\n\n")
result = cursor.fetchmany(2) # 使用fetchmany()獲取多條記錄
print(result,end="\n\n")
result = cursor.fetchall() # 使用fetchall()獲取全部查詢結果
print(result,end="\n\n")
# 修改使用者資訊
# 使用問號作為佔位符代替具體的數值,然後使用一個元組來替代問號
# 使用佔位符的方式可以避免SQL隱碼攻擊的風險
try:
cursor.execute("update user set age = %s where name = %s",(12,"Sakura"))
db.commit()
except:
db.rollback()
cursor.execute("select * from user where name = %s",("Sakura",))
result = cursor.fetchall()
print(result,end="\n\n")
# 刪除使用者資料
try:
cursor.execute("delete from user where name = %s","Shana")
db.commit()
except:
db.rollback()
cursor.execute("select * from user")
result = cursor.fetchall()
print(result,end="\n\n")
cursor.close() # 關閉遊標
db.close() # 關閉資料庫連線