標籤:

MySQL與Python的交互

1、交互類型

安裝引入模塊

安裝mysql模塊,在windows和ubuntu中

windows里安裝mysql模塊

Linux里安裝mysql模塊

在文件中引入模塊

import pymysql

connection對象

用於建立與資料庫的連接

創建對象:調用connect()方法

conn=connect(參數列表)

參數host:連接的mysql主機,如果本機是localhost

參數port:連接的mysql主機的埠,默認是3306

參數db:資料庫的名稱

參數user:連接的用戶名

參數password:連接的密碼

參數charset:通信採用的編碼方式,默認是gb2312,要求與資料庫創建時指定的編碼一致,否則中文會亂碼

對象的方法

close()關閉連接

commit()事務,所以需要提交才會生效

rollback()事務,放棄之前的操作

cursor()返回Cursor對象,用於執行sql語句並獲得結果

Cursor對象

執行sql語句

創建對象:調用Connection對象的cursor()方法

cursor1=conn.cursor()

對象的方法

close()關閉

execute(operation [, parameters ])執行語句,返回受影響的行數

fetchone()執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組

next()執行查詢語句時,獲取當前行的下一行

fetchall()執行查詢時,獲取結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回

scroll(value[,mode])將行指針移動到某個位置

mode表示移動的方式

mode的默認值為relative,表示基於當前行移動到value,value為正則向下移動,value為負則向上移動。相對的

mode的值為absolute,表示基於第一條數據的位置,第一條數據的位置為0,絕對的。

舉個例子便於理解

# 導入python操作mysql的模塊 nimport pymysql n# 獲取連接對象 nconn = pymysql.connect(host=127.0.0.1, user=root, password=123456, database=python01, port=3306, charset=utf8) n# 獲取執行工具 ncur = conn.cursor() n# sql語句,增刪改 n#sql = select birthday from t_user nsql = select id,name,pwd,birthday from t_user n# 執行,返回值。如果是增刪改,返回受影響的行數,如果是查詢,返回查詢的行數 ncount = cur.execute(sql) nprint(查詢的結果有%s條數據%count) n#獲取第一行 ndateOne = cur.fetchone() nprint(dateOne) n#向上移動一行 ncur.scroll(-1) n#向下移動一行 ncur.scroll(1) ncur.scroll(1,mode=absolute) 絕對的,這裡指的是第一行 ncur.scroll(1,mode=relative) 相對的n #獲取所有行的數據 ndataAll = cur.fetchall() nprint(dataAll)n for temp in dataAll: nprint(temp) n print(dataAll[-1][2]) #dataAll[-1]得到的是一個用戶所有的信息,dataAll[-1][2]獲取最後一個人的密碼 nfor temp in cur: nprint(temp) ns = id:%s,name:%s,pwd:%s,birthday:%s nfor temp in dataAll: n print(s%(temp[0],temp[1],temp[2],temp[3])) n# 關閉 ncur.close() nconn.close()n

對象的屬性

rowcount只讀屬性,表示最近一次execute()執行後受影響的行數

connection獲得當前連接對象

2、增刪改查(CRUD)

1、增

創建testInsert.py文件,向學生表中插入一條數據

#encoding=utf-8nimport pymysqlntry:n conn=pymysql.connect(host=localhost,port=3306,db=test1,user=root,passwd=mysql,charset=utf8)n cs1=conn.cursor()n count=cs1.execute("insert into students(sname) values(張良)")n print(count)n conn.commit()n cs1.close()n conn.close()nexcept Exception,e:n print(e)n

2、修改

創建testUpdate.py文件,修改學生表的一條數據

#encoding=utf-8nimport pymysqlntry:n conn=pymysql.connect(host=localhost,port=3306,db=test1,user=root,passwd=mysql,charset=utf8)n cs1=conn.cursor()n count=cs1.execute("update students set sname=劉邦 where id=6")n print(count)n conn.commit()n cs1.close()n conn.close()nexcept Exception,e:n print(e)n

3、刪除

創建testDelete.py文件,刪除學生表的一條數據

#encoding=utf-8nimport pymysqlntry:n conn=pymysql.connect(host=localhost,port=3306,db=test1,user=root,passwd=mysql,charset=utf8)n cs1=conn.cursor()n count=cs1.execute("delete from students where id=6")n print(count)n conn.commit()n cs1.close()n conn.close()nexcept Exception as e:n print(e)n

4、查

創建testSelectOne.py文件,查詢一條學生信息

import Pymysqlntry:n conn=Pymysql.connect(host=localhost,port=3306,db=test1,user=root,passwd=mysql,charset=utf8)n cur=conn.cursor()n cur.execute(select * from students where id=7)n result=cur.fetchone()n print resultn cur.close()n conn.close()nexcept Exception as e:n print(e)n

創建testSelectMany.py文件,查詢全部學生信息

#encoding=utf8nimport Pymysqlntry:n conn=Pymysql.connect(host=localhost,port=3306,db=test1,user=root,passwd=mysql,charset=utf8)n cur=conn.cursor()n cur.execute(select * from students)n result=cur.fetchall()n print resultn cur.close()n conn.close()nexcept Exception as e:n print(e)n

實例一:參數

# 導入python操作mysql的模塊 nimport pymysql nimport time n# 獲取連接對象 nconn = pymysql.connect(host=127.0.0.1, user=root, password=123456, database=python01, port=3306, charset=utf8) n# 獲取執行工具 ncur = conn.cursor()n # sql語句,增刪改,sql注入 nsql = insert into t_user(name,pwd,birthday) values(%s,%s,%s) n# 參數列表n name = input(輸入姓名:) npwd = input(輸入密碼:) nbirthday = input(輸入生日:) # 2017年10月01日-->日期struct_time(--->2017-10-01) nbirthday = time.strptime(birthday,%Y年%m月%d日) n#這裡我們就用到了時間與字元串的相互轉換(詳情見MySQL高級) nparams = [name,pwd,birthday] n# 執行,返回值。如果是增刪改,返回受影響的行數,如果是查詢,返回查詢的行數 ncount = cur.execute(sql,params) n#提交 nconn.commit() nprint(受影響的行數:%s%count) n# 關閉 ncur.close() nconn.close()n

實例二:拋出異常

# 導入python操作mysql的模塊nimport pymysql ntry: n conn = None ncur = None n# 獲取連接對象 nconn = pymysql.connect(host=127.0.0.1, nuser=root, npassword=123456, n database=python01, nport=3306, ncharset=utf8) n# 模擬異常 n# a = 1 / 0 n # 獲取執行工具 ncur = conn.cursor() n# sql語句,增刪改 nsql = insert into t_user(name,pwd,birthday) values("小伊","123456",str_to_date("2017年10月20日","%Y年%m月%d日")) n# 執行,返回值。如果是增刪改,返回受影響的行數,如果是查詢,返回查詢的行數 ncount = cur.execute(sql) n# 提交 nconn.commit() nprint(受影響的行數:%s % count) nexcept Exception as ex: n# 列印異常信息,測試時候使用,項目上線,去掉 n print(str(ex)) n# 將異常繼續拋出 n# raisen finally: n if cur != None: ncur.close() n if conn != None: nconn.close()n

實例三:

# 導入python操作mysql的模塊 nimport pymysql n# 獲取連接對象 nconn = pymysql.connect(host=127.0.0.1, user=root, password=123456, database=python01, port=3306, charset=utf8) n# 獲取執行工具 ncur = conn.cursor() n# sql語句,增刪改n#sql = select birthday from t_user nsql = select id,name,pwd,birthday from t_user n# 執行,返回值。如果是增刪改,返回受影響的行數,如果是查詢,返回查詢的行數 ncount = cur.execute(sql) nprint(查詢的結果有%s條數據%count) n#獲取第一行 n# dateOne = cur.fetchone() n# print(dateOne) n# for temp in cur: n# print(temp) ns = id:%s,name:%s,pwd:%s,birthday:%s nfor temp in dataAll: n print(s%(temp[0],temp[1],temp[2],temp[3])) n# 關閉 ncur.close() nconn.close()n

3、封裝

這個庫的名字:mySqlHelper

python操作mysql進行增刪改查的封裝

1、增刪改,代碼類似

2、查詢

代碼分析

1、獲取連接對象

2、sql語句不同,參數不同

3、獲取執行對象

增刪改

查詢

1、fetchone

2、fetchall

4、處理結果

5、關閉

面向對象 建立類,封裝屬性和函數

import pymysql

class MysqlHelper:

python操作mysql的增刪改查的封裝

def __init__(self, host, user, password, database, port=3306, charset=utf8):

初始化參數

:param host: 主機

:param user: 用戶名

:param password: 密碼

:param database: 資料庫

:param port: 埠號,默認是3306

:param charset: 編碼,默認是utf8

self.host = host

self.port = port

self.database = database

self.user = user

self.password = password

self.charset = charset

def connect(self):

獲取連接對象和執行對象

:return:

self.conn = pymysql.connect(host=self.host,

user=self.user,

password=self.password,

database=self.database,

port=self.port,

charset=self.charset)

self.cur = self.conn.cursor()

def fetchone(self, sql, params=None):

根據sql和參數獲取一行數據

:param sql: sql語句

:param params: sql語句對象的參數元組,默認值為None

:return: 查詢的一行數據

dataOne = None

try:

count = self.cur.execute(sql, params)

if count != 0:

dataOne = self.cur.fetchone()

except Exception as ex:

print(ex)

finally:

self.close()

return dataOne

def fetchall(self, sql, params=None):

根據sql和參數獲取一行數據

:param sql: sql語句

:param params: sql語句對象的參數列表,默認值為None

:return: 查詢的一行數據

dataall = None

try:

count = self.cur.execute(sql, params)

if count != 0:

dataall = self.cur.fetchall()

except Exception as ex:

print(ex)

finally:

self.close()

return dataall

def __item(self, sql, params=None):

執行增刪改 :param sql:

sql語句 :param params:

sql語句對象的參數列表,默認值為None

:return: 受影響的行數

count = 0

try:

count = self.cur.execute(sql, params)

self.conn.commit()

except Exception as ex:

print(ex)

finally:

self.close()

return count

def update(self, sql, params=None):

執行修改

:param sql: sql語句

:param params: sql語句對象的參數列表,默認值為None

:return: 受影響的行數

return self.__item(sql, params)

def insert(self, sql, params=None):

執行新增

:param sql: sql語句

:param params: sql語句對象的參數列表,默認值為None

:return: 受影響的行數

return self.__item(sql, params)

def delete(self, sql, params=None):

執行刪除

:param sql: sql語句

:param params: sql語句對象的參數列表,默認值為None

:return: 受影響的行數

return self.__item(sql, params)

def close(self):

關閉執行工具和連接對象

if self.cur != None:

self.cur.close()

if self.conn != None:

self.conn.close()

1、測試查詢多條數據

import mysqlHelper

# 初始化對象

helper = mysqlHelper.MysqlHelper(127.0.0.1, root, 123456, python01)

# 連接

helper.connect()

# sql

sql = select * from t_user where name = %s and id > %s # params params = [小茗,1]

# 執行

data = helper.fetchall(sql, params)

# 判斷

if data:

for temp in data:

print(temp)

else: # None,False,0

print(沒有數據.)

helper.close()

2、測試查詢一條數據

import mysqlHelper

# 初始化對象

helper = mysqlHelper.MysqlHelper(127.0.0.1, root, 123456, python01)

# 連接

helper.connect()

# sql

sql = select * from t_user where id = %s

#sql = select * from t_user where id = 1

# params params = [2]

# 執行

data = helper.fetchone(sql, params)

#data = helper.fetchone(sql)

# 判斷

if data:

print(data)

else: # None,False,0

print(沒有數據.)

3、測試增刪改

import mysqlHelper

import time

# 初始化對象

helper = mysqlHelper.MysqlHelper(127.0.0.1, root, 123456, python01)

# 連接

helper.connect()

# sql

sql = update t_user set name =%s,pwd=%s,birthday=%s where id=%s

# params

id = input(輸入編號:)

name = input(輸入姓名:)

pwd = input(輸入密碼:)

birthday = time.strptime(input(輸入生日:), %Y年%m月%d日)

params = [name, pwd, birthday,id]

# 執行

count = helper.update(sql, params)

# 判斷

if count:

print(操作成功.)

else: # None,False,0

print(操作失敗.)

4、登錄和註冊

登錄和註冊的時候需要對密碼進行加密

注意:

1、需要對密碼進行加密

2、如果使用md5加密,則密碼包含32個字元

3、如果使用sha1加密,則密碼包含40個字元,這裡使用這種方式

create table userinfos(

id int primary key auto_increment,

uname varchar(20),

upwd char(40),

isdelete bit default 0 );

/*

ret = doPwd(123)

print(ret)

結果:40bd001563085fc35165329ea1ff5c5ecbdbbeef

*/ -- 插入如下數據,用戶名為123,密碼為123,這是sha1加密後的值

insert into userinfos

values(1,123,40bd001563085fc35165329ea1ff5c5ecbdbbeef,0);

登錄與註冊

from mysqlHelper import MysqlHelper

import hashlib

def login():

登錄

name = input(輸入用戶名:)

pwd = input(輸入密碼:)

#加密

pwd = doPwd(pwd)

helper = MysqlHelper(127.0.0.1, root, 123456, python01)

helper.connect()

sql = select * from t_user where name=%s and pwd=%s

params = [name, pwd]

data = helper.fetchone(sql, params)

if data:

print(登錄成功.)

else: # None,False,0

print(登錄失敗.)

def doPwd(pwd):

sha1編碼

mysha1 = hashlib.sha1()

mysha1.update(pwd.encode(utf-8))

pwd = mysha1.hexdigest()

return pwd def register():

註冊

name = input(輸入用戶名:)

pwd = input(輸入密碼:)

# 加密

pwd = doPwd(pwd)

helper = MysqlHelper(127.0.0.1, root, 123456, python01)

helper.connect()

sql = insert into t_user(name,pwd) values(%s,%s)

params = [name, pwd]

count = helper.insert(sql, params)

if count:

print(操作成功.)

else: # None,False,0

print(操作失敗.)

if __name__ == __main__:

#register()

login()


推薦閱讀:

TAG:MySQL | Python |