python學習之操作mysql


    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()
View Code

二、增、刪、改數據

#!/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()
View Code

三、獲取新創建數據的自增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()
View Code

四、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}
View Code

五、防止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()
View Code

    為避免注入,使用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()
View Code

 六、以類的方式連接操作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()
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM