pymysql是Python中操作MySQL的模塊,本文主要介紹pymysql一些基本使用
一、查詢數據

#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 創建連接 conn = pymysql.connect(host='x.x.x.x.', port=3306, user='root', passwd='xxxx', db='xxxx') # 創建游標 cursor = conn.cursor() # 執行SQL,並返受影響行數 effect_row = cursor.execute("SELECT * FROM user_info") print(effect_row) #獲取一條數據 #row_1 = cursor.fetchone() #獲取所有數據,默認以元組形式返回 row_2 = cursor.fetchall() # 獲取剩余結果前n行數據 # row_3 = cursor.fetchmany(3) print(row_2) # 關閉游標 cursor.close() # 關閉連接 conn.close()
二、增、刪、改數據

#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 創建連接 conn = pymysql.connect(host='x.x.x.x', port=3306, user='root', passwd='xxxxx', db='xxxx') # 創建游標 cursor = conn.cursor() # 執行update SQL,並返受影響行數 #effect_row = cursor.execute("UPDATE user_info SET username='張三' WHERE nid= %s", (13,)) # 執行delete SQL,並返受影響行數 #effect_row = cursor.execute("DELETE FROM user_info WHERE nid= %s", (13,)) # 執行insert SQL,並返受影響行數 #effect_row = cursor.execute("INSERT INTO user_info (username,passwd,user_type_id) VALUES (%s,%s,%s)", ('李五','123',1)) # 執行SQL,並返回受影響行數,執行多次 effect_row = cursor.executemany("INSERT INTO user_info (username,passwd,user_type_id) VALUES (%s,%s,%s)", [('李五','123',1),('李三','123',1)]) print(effect_row) # 提交,不然無法保存新建或者修改的數據 conn.commit() # 關閉游標 cursor.close() # 關閉連接 conn.close()
三、獲取新創建數據的自增ID
可以獲取到最新自增的ID,也就是最后插入的一條數據ID

#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 創建連接 conn = pymysql.connect(host='x.x.x.x', port=3306, user='root', passwd='xxxx', db='xxxx') # 創建游標 cursor = conn.cursor() # 執行insert SQL,並返受影響行數 effect_row = cursor.execute("INSERT INTO user_info (username,passwd,user_type_id) VALUES (%s,%s,%s)", ('李六','123',1)) print(effect_row) # 提交,不然無法保存新建或者修改的數據 conn.commit() #獲取自增id new_id = cursor.lastrowid print (new_id) # 關閉游標 cursor.close() # 關閉連接 conn.close()
四、fetch數據類型
默認獲取的數據是元祖類型,如果想要字典類型的數據可以使用如下方式

#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 創建連接 conn = pymysql.connect(host='x.x.x.x', port=3306, user='root', passwd='xxx', db='xxxx') #創建游標游標設置為字典類型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("SELECT * FROM user_info") row_1 = cursor.fetchone() print(row_1) # 關閉游標 cursor.close() # 關閉連接 conn.close() 查詢結果 {'nid': 1, 'username': 'root', 'passwd': 'abc', 'user_type_id': 1}
五、防止sql注入
在構造sql語句時如果使用字符串拼接的方式,會造成sql注入
例如

#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 創建連接 conn = pymysql.connect(host='x.x.x.x', port=3306, user='root', passwd='xxxx', db='xxxx') #創建游標游標設置為字典類型 cursor = conn.cursor() sql="SELECT * FROM user_info WHERE username='%s'" name="root' or '1'-- " sql=sql % name #拼接語句被構造成下面這樣,永真條件,此時就注入成功了。因此要避免這種情況需使用pymysql提供的參數化查詢。 print(sql) #SELECT * FROM user_info WHERE username='root' or '1'-- ' cursor.execute(sql) row_1 = cursor.fetchone() print(row_1) # 關閉游標 cursor.close() # 關閉連接 conn.close()
為避免注入,使用pymysql提供的參數化語句

#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 創建連接 conn = pymysql.connect(host='x.x.x.x', port=3306, user='root', passwd='xxxx', db='xxx') #創建游標游標設置為字典類型 cursor = conn.cursor() '''sql="SELECT * FROM user_info WHERE username='%s'" name="root' or '1'-- " sql=sql % name #拼接語句被構造成下面這樣,永真條件,此時就注入成功了。因此要避免這種情況需使用pymysql提供的參數化查詢。 print(sql) #SELECT * FROM user_info WHERE username='root' or '1'-- ' cursor.execute(sql)''' #執行參數化查詢,%s不用加引號,默認會加上的 cursor.execute("SELECT * FROM user_info WHERE username=%s",('root',)) row_1 = cursor.fetchone() print(row_1) # 關閉游標 cursor.close() # 關閉連接 conn.close()
六、以類的方式連接操作mysql

''' class ConnDB: def __init__(self,host,user,passwd,db): self.host=host self.user=user self.passwd=passwd self.db=db self.conn = None self.cursor = None def connect(self, cursor=pymysql.cursors.DictCursor): self.conn = pymysql.connect(host=self.host,user=self.user,passwd=self.passwd,db=self.db) self.cursor = self.conn.cursor(cursor=cursor) return self.cursor def close(self): self.conn.commit() self.cursor.close() self.conn.close() obj=ConnDB('x.x.x.x','root','xx','xx') cursor=obj.connect() cursor.execute("SELECT * FROM user_info WHERE username=%s",('root',)) row_1 = cursor.fetchone() print(row_1) cursor.close() ''' #定義數據庫信息字典 my_dic = { "host": 'x.x.x.x, "port": 3306, "user": 'root', "passwd": 'xxx', "db": 'xxx', "charset": 'utf8' } #以字典的方式傳入數據庫登錄相關信息 class ConnDB: def __init__(self,dic): self.__conn_dict = dic self.conn = None self.cursor = None def connect(self, cursor=pymysql.cursors.DictCursor): self.conn = pymysql.connect(**self.__conn_dict) self.cursor = self.conn.cursor(cursor=cursor) return self.cursor def close(self): self.conn.commit() self.cursor.close() self.conn.close() obj=ConnDB(my_dic) cursor=obj.connect() cursor.execute("SELECT * FROM user_info WHERE username=%s",('root',)) row_1 = cursor.fetchone() print(row_1) cursor.close()