MySQL4Python-MySQL数据库交互

文章目录

    • 安装模块:
        • 模块说明:
    • 使用
        • 封装:除了sql语句及参数不同,其它语句都是一样的:封装
        • 创建MysqlHelper.py文件,定义类MySQLHelper()
    • 加密存储
        • 编码encode(),解码decode()
        • 使用hash算法加密的对象必须是二进制形式的字符串(python3.8)

安装模块:

Python2:python-mysqldb
Python3:pymysql

模块说明:

connection对象:
conn = connect(参数列表)
参数:

	host:连接的mysql主机,如果本机是'localhost'
	port:连接的mysql主机的端口,默认是3306
	db:数据库的名称
	user:连接的用户名
	password:连接的密码
	charset:通信采用的编码方式,默认是'gb2312',要求与数据库创建时指定的编码一致,否则中文会乱码

方法:

	close()关闭连接
	commit()事务,所以更新语句需要提交才会生效
	rollback()事务,放弃之前的操作
	cursor()返回Cursor对象,用于执行sql语句并获得结果

cursor对象:执行sql语句
cursor1 = conn.cursor()
方法:

	close()关闭
	execute(operation [, parameters ])执行语句,返回受影响的行数。[parameters]可用于参数化(注意,不是字符串格式化)
	cursor.execute('insert into students(name) values(%s)','alice')
	fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
	# next()执行查询语句时,获取当前行的下一行
	fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回
	scroll(value[,mode])将行指针移动到某个位置
			mode表移动方式,默认值relative:相对rownumber移动value行,value为正向下为负向上
		 	mode值absolute,绝对位置

属性:

	rowcount只读属性,表示最近一次execute()执行后受影响的行数
	connection获得当前连接对象
	rownumber当前游标所在行

使用

import pymysql


cn = pymysql.connect(host='192.168.199.156', port=3307, db='py', user='root', password='123456', charset='utf8')

try:
 	with cn.cursor() as cur1:
 		# name=input("name:")
 		# gender = input("gender:")
 		result = cur1.execute('select * from students;')
 		print(1,result)
 		# # cur1.execute('insert into students(name,gender) values(%s,%s)',[name,int(gender)])	# sql字符串里统一用%s占位,参数输入对应的数据类型即可
 		print(cur1.fetchone())
 		print(cur1.fetchall())
 		print(cur1.rowcount)
 		print(cur1.rownumber)
 		cur1.scroll(-3, 'relative')
 		print(cur1.rownumber)
 		cur1.scroll(3, 'absolute')
 		print(cur1.rownumber)
 		cn.commit()
 finally:
 	cn.close()

# try:
# 	conn=pymysql.connect(host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
#     cs1=conn.cursor()
#     count=cs1.execute("delete from students where id=6")
#     print count
#     conn.commit()
#     cs1.close()
#     conn.close()
# except Exception,e:
#     print e.message

封装:除了sql语句及参数不同,其它语句都是一样的:封装

创建MysqlHelper.py文件,定义类MySQLHelper()

class MysqlHelper():
	def __init__(self, host, port, db, user, password, charset='utf8'):
		"""实例化:记下参数"""
		self.host = host
		self.port = port
		self.db = db
		self.user = user
		self.password = password
		self.charset = charset

	# 创建对象(connection、cursor)
	def open(self):
		self.conn = pymysql.connect(host=self.host, port=self.port, db=self.db, user=self.user, password=self.password,charset=self.charset)
		self.cursor = self.conn.cursor()

	# 关闭对象
	def close(self):
		self.conn.close()
		self.cursor.close()

	# 更新数据
	def cud(self, sql, params):
		try:
			self.open()
			self.cursor.execute(sql, params)
			self.conn.commit()
			self.close()
		except Exception as e:
			print(e.args)

	# 查询数据
	def retrieve_all(self, sql, params=[]):
		try:
			self.open()
			self.cursor.execute(sql, params)
			result = self.cursor.fetchall()
			self.close()
			return result
		except Exception as e:
			print(e.args)

加密存储

编码encode(),解码decode()

字符串有两种形式:Unicode字符形式(Python中的数据类型为str)和二进制形式(Python中数据类型为bytes)
网络传输用bytes形式,值的表示为b"xxxx"(xxxx只能为ASCII编码的字符串);
内存中字符串用Unicode字符形式
str.encode()→bytes,bytes.decode()→str

  • 注意encode是str对象的方法,decode是bytes对象的方法

此外,Unicode字符还有各种编码标准:utf-8、GBK、GB2312等等

使用hash算法加密的对象必须是二进制形式的字符串(python3.8)

# hash加密:hashlib模块
import hashlib

sh1 = hashlib.sha1()		# 实例化一个sha1函数加密的hash对象
sh1.update("原内容".encode(encoding='GB2312'))		# 使用该对象加密hash文本
sh1.update(b"last add string")		# 使用该对象加密hash文本
sh1.hexdigest()		# 以16进制返回“原内容”(GB2312编码的二进制文本)拼接"last add string"(ASCII编码的二进制文本)加密后的内容
sh1.digest()		# 以二进制返回加密后的内容

if __name__ == '__main__':
	handler = MysqlHelper(host='192.168.199.156', port=3307, db='py', user='root', password='123456', charset='utf8')
	handler.open()
	print(handler.retrieve_all('select * from students where id > %s', [int(10)]))

你可能感兴趣的:(#,mysql学习,笔记)