資料庫(MySQL 8.0)--6
阿新 • • 發佈:2018-12-11
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上的執行結果: