Python知識整合(操作數據庫)

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注入

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章