1. 程式人生 > 其它 >Python3操作MySQL資料庫

Python3操作MySQL資料庫

使用Python3操作MySQL資料庫我們需要安裝三方庫PyMySQL,安裝方式如下:

$ pip install pymysql

資料庫操作步驟為:

  • 建立資料庫連線:conn = pymysql.connect()
  • 從連線建立操作遊標:cur = conn.cursor()
  • 使用遊標執行sql(讀/寫):cur.execute(sql)
  • 獲取結果(讀)/ 提交更改(寫): cur.fetchall()/conn.commit()
  • 關閉遊標及連線:cur.close();conn.close()
    遊標是指向資料緩衝區的一個變數,可以逐條的訪問資料庫執行結果集。PyMySQL中需要通過遊標來執行sql和獲取結果。

基本使用

import pymysql
# 1. 建立連線
conn = pymysql.connect(host='127.0.0.1',
                    port=3306,
                    user='root',
                    passwd='123456',   # password也可以
                    db='api_test',
                    charset='utf8')   # 如果查詢有中文需要指定資料庫編碼        
# 2. 從連線建立遊標(有了遊標才能操作資料庫)
cur = conn.cursor()
# 3. 查詢資料庫(讀)
cur.execute("select * from user where name='張三'")
# 4. 獲取查詢結果
result = cur.fetchall()
print(result)
# 3. 更改資料庫(寫)
cur.execute("delete from user where name='李四'")
# 4. 提交更改
conn.commit()  # 注意是用的conn不是cur
# 5. 關閉遊標及連線
cur.close()
conn.close()

資料庫查詢操作

使用cur.execute(), 執行資料庫查詢後無返回的是影響的行數,而非查詢結果。我們要使用cur.fetchone()/cur.fetchmany()/cur.fetchall()來獲取查詢結果

  • cur.fetchone():獲取一條資料(同時獲取的資料會從結果集刪除),返回元祖
  • cur.fetchmany(3):獲取多條資料,返回巢狀元祖(('張三','123456'),('李四','123456'),("王五","123456"))
  • cur.fetchall():獲取所有資料,返回巢狀元祖,(('張三','123456'),)

注: 獲取完資料後,資料會從資料集中刪除,再次獲取獲取不到,如:

cur.execute(select * from user where name='張三')
print(cur.fetchone()) # 取走一個結果 得到: ('張三','123456')  
print(cur.fetchone()) # 結果:None  因為上一步已經把結果取玩了
print(cur.fetchall()) # 結果:()
所以我們需要重複使用查詢結果時,需要將查詢結果賦給某個變數
cur.execute(select * from user where name='張三')
result = cur.fetchall()
print(result)  # 結果: ('張三','123456')
print(result)  # 結果: ('張三','123456')

注:如果想要獲取欄位名和值組合的字典形式的結果,可以使用字典遊標 cur = conn.cursor(pymysql.cursors.DictCurser),這樣
cur.fetchone()獲取到的是字典形式的結果,cur.fetchmany()和cur.fetchall()獲取到的是列表巢狀字典。

資料修改操作

執行修改資料庫的操作後不立即生效,使用連線conn.commit()提交後才生效,支援事物及回滾

try:
    cur.execute("insert into user (name,password) values ('張三', '123456')")
    cur.execute("insert into user (name, passwd) values ('李四'), '123456'") # 此處sql出錯
    conn.commit()  # 使用連線提交所有更改
except Exception as e:
    conn.rollback()  # 回滾所有更改(注意用的是conn)
    print(str(e))