内容:

1.pymysql介绍

2.pymysql基本使用

3.数据库加密

参考:http://www.cnblogs.com/wupeiqi/articles/5713330.html

1.pymysql介绍

pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同,在python3 中以及不支持MySQLdb这个模块了,所有我们现在只用学习pymysql即可

安装:

 pip3 install pymysql

2.pymysql基本使用

(1)预备知识:SQL

sql详细:http://www.cnblogs.com/wyb666/p/9017402.html

1 数据库通过 SQL 来操作数据
2 SQL (结构化查询语言)-> 操作数据库的接口 也就是操作数据库的方法
3 增加数据 删除数据 修改数据 查询数据
4 CRUD
5 create retrieve update delete

(2)使用pymysql操作MySQL的大致流程

 import pymysql

 # 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
# 创建游标
cursor = conn.cursor() # 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'") # 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,)) # 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) # 提交,不然无法保存新建或者修改的数据
conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close()

(3)对以上过程的封装

看到这里你可能会好奇,以上那种用法不是蛮好吗,直接从上到下执行代码,干嘛还要封装,封装是为了代码的逻辑性更强,另外代码具有更多的可拓展性,我们自己封装直接封装成函数即可,不必封装成类(那样也可以不过太麻烦太复杂了),当然我们也可以使用别人的封装(后面要学到的SQLAlchemy就是一种简单的封装,其将对数据库的操作封装成对类的操作)

SQL操作无非可分为以下几种:

  • 创建库表
  • 增删改查数据

所以我将这些功能封装成相应的函数即可,如下所示:

 # __author__ = "wyb"
# date: 2018/8/20
import pymysql # 创建数据库中的表
def create(conn):
# 注意 CREATE TABLE 这种语句不分大小写
sql_create = '''
CREATE TABLE `users` (
`id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(200) NOT NULL UNIQUE,
`password` TEXT NOT NULL,
`email` TEXT
)
'''
# 用 execute 执行一条 sql 语句
conn.execute(sql_create)
print('创建成功') # 向数据库中插入数据
def insert(conn, username, password, email):
sql_insert = '''
INSERT INTO
users(username,password,email)
VALUES
(%s, %s, %s);
'''
# 参数拼接要用 %s,execute 中的参数传递必须是一个 tuple 类型
conn.execute(sql_insert, (username, password, email, ))
print('插入数据成功') # 查询数据
def select(conn):
sql = '''
SELECT
*
FROM
users
'''
# 这是读取数据的套路
conn.execute(sql)
res = conn.fetchall()
print("所有数据如下: ")
for row in res:
print(row) # 删除数据
def delete(conn, user_id):
sql_delete = '''
DELETE FROM
users
WHERE
id=%s
'''
# 注意, execute 的第二个参数是一个 tuple
# tuple 只有一个元素的时候必须是这样的写法
conn.execute(sql_delete, (user_id,))
print("删除数据成功") # 更新数据
def update(conn, user_id, email):
sql_update = '''
UPDATE
`users`
SET
`email` = %s
WHERE
`id`= %s
'''
conn.execute(sql_update, (email, user_id))
print("更新数据成功") # 主程序
def main():
# 指定数据库名字并打开 -> 没有会自动创建
# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='wyb')
print("打开数据库wyb")
# 创建游标
cursor = conn.cursor() # create 创建表结构 -> 注意创建表只能创建一次 创建已创建的表会报错
# create(cursor) # insert 插入数据 -> 注意插入一次后下面的数据就不能再插入 因为用户名有限制(unique)
# insert(cursor, 'wpz', '123', 'tggh@b.c') # delete 删除数据
# delete(cursor, 1) # update 更新数据
# update(cursor, 4, 'woz_wyb@qq.com')
# select 查询数据
# select(cursor) # 最后提交: 必须用 commit 函数提交你的修改 否则你的修改不会被写入数据库
conn.commit()
# 用完数据库要关闭
cursor.close()
conn.close() if __name__ == '__main__':
main()

先运行上述代码中的create函数,然后操作如下:

可以明显看到现在已经通过程序建立了数据库的表结构,接下来使用其他函数体验一下增删改查(insert、delete、update、select),每个函数运行完后在终端上

使用select * from users;查看表中数据变化

(4)fetch数据类型

默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:

 import pymysql

 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')

 # 游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()") result = cursor.fetchone() conn.commit()
cursor.close()
conn.close()

3.数据库加密

众所周知,数据库加密是十分重要的,因为数据库会存储一些敏感信息,比如密码,即使我们的程序没有任何的安全漏洞不会被黑客攻击,但是程序所在的服务器可能有安全漏洞,我们使用的数据库软件可能会有漏洞,因此要对数据中的一些敏感信息(比如密码)进行加密存储

(1)数据库加密方法

常见的加密算法有对称加密、非对称加密以及hash算法,一般数据库中敏感信息使用hash算法加密即可

常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1

(2)加密实例

注册登录验证(密码加密):

 class User(Model):
"""
User 是一个保存用户数据的 model
现在只有两个属性 username 和 password
"""
def __init__(self, form):
self.id = form.get('id', None)
self.username = form.get('username', '')
self.password = form.get('password', '') # 加盐加密
@staticmethod
def salted_password(password, salt="`1234567890~!@#$%^&*()-=[];'\/,./ZXCVBNSADFYWQET"):
# salt: "`1234567890~!@#$%^&*()-=[];'\/,./ZXCVBNSADFYWQET"
def md5hex(ascii_str):
return hashlib.md5(ascii_str.encode('ascii')).hexdigest() # 普通加密
hash1 = md5hex(password)
# 加盐加密
hash2 = md5hex(hash1 + salt)
return hash2 # 注册
def validate_register(self):
pwd = self.password
self.password = self.salted_password(pwd)
# 用户名已存在就不允许注册 否则可以注册
if User.find_by(username=self.username) is None:
self.save()
return self
else:
return None # 登录
def validate_login(self):
u = User.find_by(username=self.username)
if u is not None:
return u.password == self.salted_password(self.password)
else:
return False # 修改密码
def change_pwd(self, form):
# 输入两次旧密码不一样
pwd1 = form.get("pwd1", "")
pwd2 = form.get("pwd2", "")
if pwd1 != pwd2:
res = {
"msg": "两次输入的旧密码不一样",
"data": None,
}
return res # 输入的旧密码正确就重置 否则就不重置
new_pwd = form.get("new_pwd", "")
if self.salted_password(pwd1) == self.password:
self.password = self.salted_password(new_pwd)
self.save()
res = {
"msg": "重置密码成功",
"data": self,
}
else:
res = {
"msg": "输入的旧密码错误!",
"data": None,
}
return res

注意:上述代码不是完整代码,但不用关心其他细节,只关心具体的加密以及验证方法

上述代码的加密逻辑:

使用python的hashlib加密模块,先用普通的md5的hash算法直接对密码进行加密,然后再对加密后的密文加上盐再进行加密

验证逻辑:

将用户输入的密码同样使用上述方法加密,如果最后结果和数据库中存的结果是一样的,那么就通过验证,否则验证失败

由此,可以得出结论:

假设密码存入数据库均经过上述过程中的hash加密,那么除了用户本人没有人会知道到底密码是什么(当然黑客破解也不是不行,但破解难度极大),所以当忘记密码时一般都不能直接找回密码,而是通过回答密保问题(或其他方式)来修改密码,因为除了用户自己没有人知道密码是什么

python连接数据库(pymysql)及数据库加密的更多相关文章

  1. 3.Python连接数据库PyMySQL

    1.安装PyMySQL,输入命令:pip3 install PyMySQL 2.使用Navicat,创建数据库:TESTDB,表:EMPLOYEE,字段:FIRST_NAME,LAST_NAME,AG ...

  2. Python使用PyMysql操作数据库

    安装 pip install -U pymysql 连接数据库 连接数据库有两种不同的格式 直接使用参数 代码如下 import pymysql.cursors connection = pymysq ...

  3. python 连接数据库 pymysql模块的使用

    一 Python3连接MySQL 本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用. 1 PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MyS ...

  4. python通过pymysql实现数据库的增删改查

    今天实现了python对于数据库的增删改查工作: 具体的每一步的数据库的增删盖茶自己都实验过了. 掌握了基本的数据库操作语言.然后就是对于tuple()的认识. 以及对于查询语句中的:fetchone ...

  5. Python操作pymysql写入数据库时的错误

    错误一 InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xE6\\xAD\\xA3 ...

  6. python之pymysql模块学习(待完善...)

    pymysql介绍 pymysql是在python3.x版本中用于连接mysql服务器的一个库.python2中则使用mysqldb. 安装方法: pip install pymysql 使用实例: ...

  7. Python全栈 MySQL 数据库 (引擎、事物、pymysql模块、orm)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图     存储引擎(处理表的处理器)     基本操作:         ...

  8. 百万年薪python之路 -- MySQL数据库之 Navicat工具和pymysql模块

    一. IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接 ...

  9. Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁

    Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁 一丶安装 pip install PyMySQL 二丶pymysql连接数据库 ### 语法: ...

随机推荐

  1. TF-IDF算法(2)—python实现

    参加完数模之后休息了几天,今天继续看TF-IDF算法.上篇中对TF-IDF算法已经做了详细的介绍,在此不再赘述.今天主要是通过python,结合sklearn库实现该算法,并通过k-means算法实现 ...

  2. PS如何批量处理图片

    喜爱摄影的朋友可能都有这样的体会,相机里面存了大量的图片,一般都是2048×1536或者更大像素的照片,每张都有1M以上,如果设置的清晰度高,则照片就更大,这样的图片是无法上传到博客中的(博客要求每张 ...

  3. Linux配置python和pip环境

    CentOS: 1.首先安装EPEL扩展源: yum install -y epel-release 2.系统自带python2,所以只需安装python3 yum install -y python ...

  4. CTF-练习平台-Misc之 Linux??????

    八.Linux?????? 下载文件,解压后只得到一个没有后缀名的文件,添加后缀名为txt,打开搜索,关键词为“flag”,没有找到:改关键词为“key”得到答案

  5. POJ3669解题报告(bfs)

    POJ3669http://poj.org/problem?id=3669 很明显是一道bfs的题目 由于陨石的降临具有时刻性,所以地图是随时间变化的, 所以可以使用结构体来存储陨石下落的时刻以及位置 ...

  6. MySQL--忘记MYSQL管理员密码

    如root用户密码,可以按照以下方式来修改: STEP1: 停止MySQL服务 ps -ef | grep -v 'grep' | grep 'mysqld' | awk '{print $2}' | ...

  7. fl包下的TransitionManager的使用

    http://www.republicofcode.com/tutorials/flash/as3transitionmanager/

  8. RabbitMQ客户端负载均衡算法

    负载均衡(Load balance)是一种计算机网络技术,用于在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最佳资源使用.最大化吞吐率.最小响应时间以及避免过载的 ...

  9. Microsoft Dynamics CRM 2011 中 SQL 语句总结

    一.查询用户和团队 插入的类型:OwnerIdType 可以为用户或团队: 1.团队: select top 1 ObjectTypeCode from metadataschema.entity w ...

  10. ASP.NET WEB SERVICE 创建、部署与使用

    PS: 开发工具 VS2010, 所有工程都为Debug状态,本人刚接触 Web Service,此文为菜鸟入门用例,高手勿笑! 转载请注明出处 :http://www.cnblogs.com/yyc ...