1、數據庫編程接口
市面有多種數據庫如mysql、SQLite等等。爲了對數據庫進行統一的操作,大多數語言提供了簡單的、標準化的數據庫接口(API)。在Python Database API 2.0規範中,定義了Python數據庫API接口的各個部分。下面我將介紹數據庫API接口中的連接對象和遊標對象
1.1、連接對象
數據庫連接對象(Connection Object)主要提供數據庫遊標對象和提交/回滾事物的方式,以及關閉數據庫連接。
1.11、獲取連接對象
使用connect()函數獲取數據庫連接,改函數具有多個參數,具體使用那個參數,根據數據庫的類型而定。
onnect()函數參數說明表
參數 | 說明 |
---|---|
dsn | 數據源名稱,給出該參數表示數據庫依賴 |
user | 用戶名 |
password | 用戶密碼 |
host | 主機名 |
database | 數據庫名稱 |
例子,使用PyMySql模塊連接MySQL數據庫(在下面內容中會詳細介紹)。
conn = pymysql.connect(host='localhost',
user='user',
password='passwd',
charset='utf-8'
cursorclass=pymysql.cursors.DictCursor)
注意pymysql.connect()使用的參數與上表不完全相同,要以具體的數據庫模塊爲準。
1.12、連接對象方法
connect()函數返回連接對象,這個連接對象表示目前和數據庫的會話。連接對象支持的方法如下表
方法名 | 說明 |
---|---|
close() | 關閉數據庫連接 |
commit() | 提交事物 |
rollback() | 回滾事物 |
cursor() | 獲取遊標對象,操作數據庫,如執行DML(觸發器)操作,調用存儲過程等 |
1.2、遊標對象
遊標對象(Cursor Object)代表數據庫中的遊標,用於指示抓取數據操作的上下文,主要提供執行SQL語句、調用存儲過程等。
通過cursor()方法可以獲取遊標對象。
遊標對象的屬性:1、description:數據庫列表類型和值的描述信息。2、rowcount():返回結果的函數統計信息,如SELECT、UPDATE等
遊標對象的方法如下表
方法名 | 說明 |
---|---|
callproc(procname[,parameters]) | 調用存儲過程,需要數據庫支持 |
close() | 關閉當前遊標 |
execute(operation[,parameters]) | 執行SQL語句或者數據庫命令等數據庫操作 |
executemany(operation,seq_params) | 用於批量操作,如批量刪除 |
fetchone() | 獲取查詢結果集中的下一條記錄 |
fetchmany(size) | 獲取指定數量的記錄 |
fetchall() | 獲取結果集中的所有記錄 |
nextset() | 跳至下一個可用的結果集 |
arraysize() | 指定使用fetchmany獲取的函數,默認爲1 |
setinputsize(sizes) | 設置在調用execute*()方法時分配的內存區域大小 |
setoutputsize(sizes) | 設置列緩衝區大小,對大數據列如LONGS和BLOBS(二進制大對象)尤其有用 |
2、使用SQLite
SQLite(c語言寫的)是一種嵌入式數據庫,它的數據庫是一個文件。體積小,且可以跨平臺使用,經常被嵌入到各種應用程序。python中內置了SQLite3。
2.1、創建數據庫文件
python操作數據流的流程
開始>>創建connection(連接)>>獲取cursor(遊標)>>執行SQL語句,處理數據結果>>關閉cursor(遊標)>>關閉connection(連接)
如
import sqlite3 # 連接到SQLite數據庫
conn = sqlite3.connect('1.db') # 數據庫文件是test.db,如果文件不存在,會在當前目錄創建
cursor = conn.cursor() # 創建一個Cursor
cursor.execute('create table user (id int(10) primary key, name varchar(20))') # 執行一條SQL操作,創建user表
cursor.close() # 關閉遊標
conn.close() # 關閉連接
2.2、操作SQLite
2.21、新增用戶數據信息
使用以下SQL語句
insert into 表名 (字段名1,字段名1,........) values(字段值1,字段值2,.......)
例子
import sqlite3 # 連接到SQLite數據庫
conn = sqlite3.connect('name.db') # 數據庫文件是test.db,如果文件不存在,會在當前目錄創建
cursor = conn.cursor() # 創建一個Cursor
# 執行一條SQL操作,創建user表
cursor.execute('create table user (id int(10) primary key, name varchar(20))')
# 執行一條SQL操作,向表user插入一條記錄
cursor.execute('insert into user (id, name) values ("1","wr")')
cursor.execute('insert into user (id, name) values ("2","小明")')
cursor.close() # 關閉遊標
conn.commit() # 提交事物
conn.close() # 關閉連接
爲了驗證程序是否正常可以再次運行程序,如果出現如下異常
sqlite3.OperationalError: table user already exists
則說明數據成功插入
2.22、查看用戶數據信息
可以使用以下SQL語句
select 字段名1,字段名2,..... from 表名 where 查詢條件
fetchone():查詢結果集中的下一條記錄
fetchmany(size) :獲取指定數量的記錄
fetchall():獲取結果集的所有記錄
例子
import sqlite3 # 連接到SQLite數據庫
conn = sqlite3.connect('name.db') # 數據庫文件是name.db,如果文件不存在,會在當前目錄創建
cursor = conn.cursor() # 創建一個Cursor
# 執行查詢語句
cursor.execute('select * from user')
# 獲取查詢結果
result = cursor.fetchone()
print(result)
cursor.close() # 關閉遊標
conn.close() # 關閉連接
修改上述 cursor.execute('select * from user')
這句代碼爲cursor.execute('select * from user where id > ?',(1,))
,其中使用問號作爲佔位符代替具體的值,然後使用最後一個元組來替換問號,注意元組最後面的逗號不能省略
修改後的代碼等價於cursor.execute('select * from user where id > 1)
不過推薦佔位符的方式,因爲可以有效防止SQL注入
2.23、修改用戶數據信息
可以使用以下sql語句
update 表名 set 字段名 = 字段值 where 查詢語句
例子,將ID=1的name改爲WR
import sqlite3 # 連接到SQLite數據庫
conn = sqlite3.connect('name.db') # 數據庫文件是test.db,如果文件不存在,會在當前目錄創建
cursor = conn.cursor() # 創建一個Cursor
cursor.execute('update user set name = ? where id = ?', ('WR', 1))
# 執行查詢語句
cursor.execute('select * from user')
# 獲取查詢結果
result1 = cursor.fetchall()
print(result1)
cursor.close() # 關閉遊標
conn.commit() # 提交事務
conn.close() # 關閉連接
2.24、刪除用戶信息
可以使用以下sql語句
delete from 表名 where 查詢語句
3、使用MySQL
可以直接安裝phpstudy集成環境,包括mysql和apache數據庫及其環境。安裝步驟可以百度
3.1、安裝PyMySQL模塊
在python中支持MYSQL的數據庫模塊很多,我們選擇PyMySQL模塊
在命令行使用下面語句 pip install PyMySQL
安裝PyMySQL模塊
3.2、連接數據庫
PyMySQL模塊也遵循Python Database API 2.0規範,故MySQL的操作方法與SQLite類似
例子
import pymysql
# 打開數據庫連接,參數1:主機名或IP;參數2:用戶名;參數3:密碼;參數4;數據庫名稱
db = pymysql.connect("localhost", "root", "root", "mydata")
# 通過cursor()函數創建一個遊標對象cursor
cursor = db.cursor()
# 使用execute()方法執行SQL查詢
cursor.execute('SELECT VERSION()')
# 使用 fetchone()方法獲取單條信息
data = cursor.fetchone()
print("database version: %s" % data)
# 關閉數據庫連接、
db.close()
輸出
database version: 5.5.53
3.3、創建數據表
例子:通過execute()方法創建表books(圖書表)。books包含id(主鍵),name(圖書名),category(圖書館分類),price(圖書館價格)
import pymysql
# 打開數據庫連接,參數1:主機名或IP;參數2:用戶名;參數3:密碼;參數4;數據庫名稱
db = pymysql.connect("localhost", "root", "390800956", "mydata")
# 通過cursor()函數創建一個遊標對象cursor
cursor = db.cursor()
# 使用execute()方法執行SQL語句,如果存在就刪除
cursor.execute('DROP TABLE IF EXISTS books')
sql = """
CREATE TABLE books(
id int(8) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
category varchar(50) NOT NULL,
price decimal(10,2) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
"""
cursor.execute(sql)
# 關閉數據庫連接、
db.close()
3.4、操作數據表
可以execute()方法添加一條記錄,也可以使用executemany()方法進行批量添加記錄
語法格式
executemany(operation,seg_of_params)
說明:
operation:執行的sql語句
seg_of_params:參數序列
例子
import pymysql
# 打開數據庫連接,參數1:主機名或IP;參數2:用戶名;參數3:密碼;參數4;數據庫名稱
db = pymysql.connect("localhost", "root", "390800956", "mydata", charset="utf8")
# 通過cursor()函數創建一個遊標對象cursor
cursor = db.cursor()
# 數據列表
data = [("《見識》", "literature", "50.00"),
("《智能時代》", "data", "70.00"),
("《活着》", "literature", "23.00")]
try:
# 執行SQL語句,插入多條數據
cursor.executemany("insert into books (name, category, price) values (%s, %s, %s)", data)
# 提交數據
db.commit()
except:
# 發送錯誤時回滾
db.rollback()
# 關閉數據庫連接、
db.close()
在上面的代碼中要注意
1、在使用connect()方法時,設置charset=“utf8”,爲得是識別中文
2、在使用insert語句插入數據時,使用%s作爲佔位符,防止SQL注入