一.簡介?
pymsql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同,但目前pymysql支持python3.x而后者不支持3.x版本
其執行語句與sql源碼相似
二.使用
1.安裝
? pip install pymysql
2.使用操作
先來一例完整的連接加基本的操作
import?pymysql ?? #?創建連接 conn?=?pymysql.connect(host='127.0.0.1',?port=3306,?user='root',?passwd='123',?db='t1') #?創建游標 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語句,當出現異常是主動回滾
#!/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’)])
#?創建連接 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中定義了一些數據庫操作的錯誤及異常,下表列出了這些錯誤和異常: