pymysql 操做數據庫

一.簡介 python

  pymsql是Python中操做MySQL的模塊,其使用方法和MySQLdb幾乎相同,但目前pymysql支持python3.x然後者不支持3.x版本mysql

  其執行語句與sql源碼類似sql

二.使用數據庫

1.安裝python3.x

   pip install pymysqlapp

2.使用操做fetch

  先來一例完整的鏈接加基本的操做spa

import pymysql
  
# 建立鏈接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
#第二種建立鏈接方式
#鏈接配置信息 
config = { 
    'host':'127.0.0.1', 
    'port':3306, 
    'user':'root', 
    'password':'123', 
    'db':'t1', 
    'charset':'utf8mb4',         
    'cursorclass':pymysql.cursors.DictCursor, 
} 
# 建立鏈接 (2)
connection = pymysql.connect(**config)

# 建立遊標
cursor = conn.cursor()
  
# 執行SQL,並返回收影響行數
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
  
# 執行SQL,並返回受影響行數
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
  
# 執行SQL,並返回受影響行數
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  
  
# 提交,否則沒法保存新建或者修改的數據
conn.commit()
  
# 關閉遊標
cursor.close()
# 關閉鏈接
conn.close()    

向數據庫插入數據,使用try語句,當出現異常是主動回滾code

#!/usr/bin/python3

import pymysql

# 打開數據庫鏈接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法獲取操做遊標 
cursor = db.cursor()

# SQL 插入語句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # 執行sql語句
   cursor.execute(sql)
   # 提交到數據庫執行
   db.commit()
except:
   # 若是發生錯誤則回滾
   db.rollback()

# 關閉數據庫鏈接
db.close()

3.向數據表中插入多條數據,使用executemany方法,在生產環境中插入多條數據 ,在後臺中獲取數據後,以列表的形式傳入語句([('v1','v2'),('v3','v4')])orm

# 建立鏈接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 建立遊標
cur = conn.cursor()
 if request.method == "POST":
        title = request.POST.get("title")
        title_en = request.POST.get("title_en")
        content = request.POST.get("content")
        content_en = request.POST.get("content_en")
        notification_type =request.POST.get("notification_type").strip()
        user_list = request.POST.get("user_list")
        updated_datetime = datetime.now()
        created_datetime = datetime.now()
        values_list = []
         for user in user_id_list:
                temp = updated_datetime,created_datetime,title,title_en,content,content_en,notification_type,user['id']
                values_list.append((temp))
     try:   cur.executemany(
'''insert into app_notification(updated_datetime, created_datetime, title, title_en, content, content_en, notification_type, is_read, recipient_id) values(%s, %s, %s, %s, %s, %s, %s, 0, %s)''',values_list) conn.commit() conn.close()
     
    except Exception as err:
    conn.rollback()
    logging.error(err)
    logging.error(traceback.format_exc())
    conn.close()
# 獲取最新自增ID
  new_id =  cursor .lastrowid

4.數據庫查詢操做

Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。

  • fetchone(): 該方法獲取下一個查詢結果集。結果集是一個對象
  • fetchall(): 接收所有的返回結果行.
  • rowcount: 這是一個只讀屬性,並返回執行execute()方法後影響的行數。
import pymysql
  
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.execute("select * from hosts")
  
# 獲取第一行數據
row_1 = cursor.fetchone()
  
# 獲取前n行數據
# row_2 = cursor.fetchmany(3)
# 獲取全部數據
# row_3 = cursor.fetchall()
  
conn.commit()
cursor.close()
conn.close()

注:在fetch數據時按照順序進行,能夠使用cursor.scroll(num,mode)來移動遊標位置,如:

  • cursor.scroll(1,mode='relative')  # 相對當前位置移動
  • cursor.scroll(2,mode='absolute') # 相對絕對位置移動

5。fetch數據類型

  關於默認獲取的數據是元祖類型,若是想要或者字典類型的數據,即:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
  
# 遊標設置爲字典類型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()")
  
result = cursor.fetchone()
  
conn.commit()
cursor.close()
conn.close()

錯誤處理

DB API中定義了一些數據庫操做的錯誤及異常,下表列出了這些錯誤和異常:

異常 描述
Warning 當有嚴重警告時觸發,例如插入數據是被截斷等等。必須是 StandardError 的子類。
Error 警告之外全部其餘錯誤類。必須是 StandardError 的子類。
InterfaceError 當有數據庫接口模塊自己的錯誤(而不是數據庫的錯誤)發生時觸發。 必須是Error的子類。
DatabaseError 和數據庫有關的錯誤發生時觸發。 必須是Error的子類。
DataError 當有數據處理時的錯誤發生時觸發,例如:除零錯誤,數據超範圍等等。 必須是DatabaseError的子類。
OperationalError 指非用戶控制的,而是操做數據庫時發生的錯誤。例如:鏈接意外斷開、 數據庫名未找到、事務處理失敗、內存分配錯誤等等操做數據庫是發生的錯誤。 必須是DatabaseError的子類。
IntegrityError 完整性相關的錯誤,例如外鍵檢查失敗等。必須是DatabaseError子類。
InternalError 數據庫的內部錯誤,例如遊標(cursor)失效了、事務同步失敗等等。 必須是DatabaseError子類。
ProgrammingError 程序錯誤,例如數據表(table)沒找到或已存在、SQL語句語法錯誤、 參數數量錯誤等等。必須是DatabaseError的子類。
相關文章
相關標籤/搜索