1. 程式人生 > >資料庫(MySQL 8.0)--6

資料庫(MySQL 8.0)--6

MySQL與Python的互動

安裝模組

sudo apt-get install python-mysqldb #這是pyhton2裡面的模組,python3是PyMySQL

Connection物件 作用:用於建立與資料庫的連線 建立物件:呼叫connect()方法conn = connect(引數列表) 引數host:連線的mysql主機,本機是"localhost" 引數port:連線的mysql主機的埠,預設是3306 引數db:資料庫的名稱 引數user:連線的使用者名稱 引數passwd:連線的使用者的密碼 引數charset:通訊採用的編碼方式,推薦使用"utf8"

物件conn的方法

close() #關閉連線
commit() #事務提交才能生效
rollback() #事務放棄之前的操作
cursor() #返回Cursor物件,用於執行sql語句並獲得結果

Cursor物件 作用:執行sql語句 建立物件:呼叫Connection物件的cursor()方法

cursor1 = conn.cursor()

物件cursor1的方法

close() #關閉
execute(operation[,parameters]) #執行語句,返回結果
fetchone() #執行查詢語句時獲得查詢結果集的第一行資料,返回元組
next() #執行查詢語句時獲得當前行的下一行
fetchall() #執行查詢時獲得結果集的所有行,一行構成一個元組,再將這些元組放在一個大元組
scroll(value[,mode]) #將行指標移動到某個位置
#mode表示移動方式,預設值為relative,表示基於當前行移動到value(value為+則向下移動為-則向上移動)
#mode的值為absolute表示基於第一條資料的位置(為0)

物件cursor1的屬性 rowcount只讀屬性,表示最近一次execute()執行後受影響的行數; connection獲得當前連線物件

pycharm連線mysql 新增: 新增前表是這樣的 在這裡插入圖片描述

#coding=utf-8

from pymysql import *

#開啟資料庫連線
db = connect(host="localhost" ,port=3306, user="root",passwd='******', db='python3')
#注意這裡賦值要把前面的賦值的物件寫出來,如host="localhost",對應項賦值,不要會報錯

#使用cursor()方法建立一個遊標物件
cursor = db.cursor()

#使用execute()方法執行SQL查詢
sql = """insert into students values(0,'許會芬',0,'1995-08-11',1)"""
cursor.execute(sql)

db.commit() #因為預設是開啟事務模式,所以要commit是執行生效
cursor.close()
db.close()

在pycharm中執行上面的程式碼,結果是這樣的 在這裡插入圖片描述 注:修改,刪除等操作就是更改sql的語句

sql語句引數化 目的:執行的時候提供額外的引數,為了資料庫資料操作的安全性 比如:a’ or 1=1 or ’ select * from students where name=’’ 也就是select * from students where name=‘a’ or 1=1 or ''就會出現問題了

#coding=utf-8

from pymysql import *

#開啟資料庫連線
db = connect(host="localhost" ,port=3306, user="root",passwd='123123', db='python3')

#使用cursor()方法建立一個遊標物件
cursor = db.cursor()

#使用execute()方法執行SQL查詢
#sql = "insert into students values(0,'許會芬',0,'1995-08-11',1)" #新增
#sql1 = "delete from students where id=11" #刪除

paramList = ["曹旭",'1996-04-09'] #將引數列表化
sql2 = "insert into students(sname,birthday) values(%s,%s)" #不管資料型別都是用%s佔位
cursor.execute(sql2,paramList) #列表順序應該對應(sname,birthday)

db.commit() #因為預設是開啟事務模式,所以要commit是執行生效
cursor.close()
db.close()

在這裡插入圖片描述 封裝 從上面的程式碼可以看出很多程式碼都在重複使用,所以我們考慮用封裝

#coding=utf-8

from pymysql import *

#用類來封裝
class MysqlOperation(object): #建立類,類名自己定
    def __init__(self,host,port,user,passwd,db,charset='utf8'): #有預設引數的要放在後面,否則報錯
        self.host = host
        self.port = port
        self.user = user
        self.passwd = passwd
        self.db = db
        self.charset = charset

    def ConnOpen(self): #建立開啟函式
    #定義了兩個物件,連線物件和遊標物件
        self.conn = connect(host=self.host,port=self.port,user=self.user,
                            passwd=self.passwd,db=self.db,charset=self.charset)
        self.cursor = self.conn.cursor()

    def ConnClose(self): #有開啟就要有關閉
        self.cursor.close()
        self.conn.close()

    def CUD(self,sql,params): #增改刪操作
        try:
            self.ConnOpen() #建立兩個物件

            self.cursor.execute(sql,params) #執行
            self.conn.commit() #提交事務

            self.ConnClose() #關閉兩個物件

            print("OK") #如果成功則列印OK

        except Exception as e: #如果出錯則返回錯誤資訊
            print(e.message)

    def ReturnAll(self,sql,params): #封裝了查詢所有資料的操作
        try:
            self.ConnOpen()

            self.cursor.execute(sql, params)
            result = self.cursor.fetchall() #返回查詢的所有資料

            self.ConnClose()

            return result #要有返回值作為接受值

        except Exception as e:
            print(e.message)

#呼叫封裝的類
params = ["飛飛","1998-09-24"]
sql = "insert into students(sname,birthday) values(%s,%s)"

mysql = MysqlOperation("localhost",3306,"root","123123","python3") #傳引數
mysql.CUD(sql,params) #執行函式

可以看到在終端的結果 在這裡插入圖片描述 小練習:使用者登入 思路: 在這裡插入圖片描述 首先我們建立一個使用者資訊表,passwd是SHA1加密過的 在這裡插入圖片描述 新增資料(這裡的密碼是1234qwer) 在這裡插入圖片描述 在pycharm新增以下程式碼

#coding=utf-8

from pymysql import *
#用類來封裝
class MysqlOperation(object): #建立類,類名自己定
    def __init__(self,host,port,user,passwd,db,charset='utf8'): #有預設引數的要放在後面,否則報錯
        self.host = host
        self.port = port
        self.user = user
        self.passwd = passwd
        self.db = db
        self.charset = charset

    def ConnOpen(self): #建立開啟函式
    #定義了兩個物件,連線物件和遊標物件
        self.conn = connect(host=self.host,port=self.port,user=self.user,
                            passwd=self.passwd,db=self.db,charset=self.charset)
        self.cursor = self.conn.cursor()

    def ConnClose(self): #有開啟就要有關閉
        self.cursor.close()
        self.conn.close()

    def CUD(self,sql,params): #增改刪操作
        try:
            self.ConnOpen() #建立兩個物件

            self.cursor.execute(sql,params) #執行
            self.conn.commit() #提交事務

            self.ConnClose() #關閉兩個物件

            print("OK") #如果成功則列印OK

        except Exception as e: #如果出錯則返回錯誤資訊
            print(e.message)

    def ReturnAll(self,sql,params): #封裝了查詢所有資料的操作
        try:
            self.ConnOpen()

            self.cursor.execute(sql, params)
            result = self.cursor.fetchall() #返回查詢的所有資料

            self.ConnClose()

            return result #要有返回值作為接受值

        except Exception as e:
            print(e.message)

#主程式碼:
from hashlib import sha1 #python自帶的加密包hashlib,選中hashlib按Ctrl+B可以看到原始碼

#接受使用者數輸入
name = input("請輸入使用者名稱:")
pwd = input("請輸入密碼:")

#對密碼加密,在原始碼裡面可以看見模組的使用方法
sh = sha1()
sh.update(b"pwd")
pwd2 = sh.hexdigest()
print("密碼加密後的結果是:",pwd2)

#根據使用者名稱查詢密碼
sql = "select passwd from users where name=%s"
mySql = MysqlOperation("localhost",3306,"root","123123","python3")
result = mySql.ReturnAll(sql,name) #查到就按元組返回(('37fa265330ad83eaa879efb1e2db6380896cf639'),)
#如果結果為空就返回空元組()
#print(result)

#也就是說如果返回的是空元組,則使用者名稱不存在
if len(result)==0:
    print("使用者名稱錯誤")

elif result[0][0]==pwd2:
    print("登入成功")

else:
    print("密碼錯誤")

在pycharm上的執行結果: 在這裡插入圖片描述