内容:

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. VS2015 Release 生成调试信息

    - C/C++ > 常规 > 调试信息格式 - C/C++ > 优化 > 优化 > 禁止(/Od) - 链接器 > 调试 > 生成调试信息 > 是 (/ ...

  2. ajax提交post请求出现数组被截断情况的解决方法

    一.场景 php post 提交数据时传的数据时数组,没有多数据进行序列化处理.发现传到服务端时,部分数据丢失,查询了资料发现php对参数个数有限制,限制在php配置文件中(max_input_var ...

  3. BZOJ1076: [SCOI2008]奖励关【状压DP+期望DP】

    Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的 ...

  4. Vue中的“混合”——mixins使用方法

    混合是一种灵活的分布式复用 Vue 组件的方式.混合对象可以包含任意组件选项.以组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项.当组件和混合对象含有同名选项时,这些选项将以恰当的方式混 ...

  5. 实习第一天:try和catch的使用

    package wo;public class wowo{ public static void main(String[] args){ try{ // int i = 1/0; 是没有语法错误的, ...

  6. ballerina 学习二十六 项目docker 部署&& 运行(二)

    ballerina 从发布,到现在官方文档的更新也是很给力的,同时也有好多改进,越来越好用了 可以参考官方文档 https://ballerina.io/learn/by-guide/restful- ...

  7. mibox connections

    tcp        0      0 :::52549                :::*                    LISTEN      4398/net.myvst.v2:mt ...

  8. java 访问修饰符:public protected default private

  9. Dynamics CRM 2011 快速查找 出现异常 QuickFindQueryRecordLimit exceeded. Cannot perform this operation 的解决方法

    一.CRM 2011 快速查找,输入编号的签名几个字母发现查询很慢. 图 1 当然在图1 上右边的出入框输入编号的部分的时候,有时候会发现数据在加载中..,非常慢,通过Crm Trace Log Vi ...

  10. Dynamics CRM 2011 怎么根据记录的etc参数值找到实体英文名和根据etc参数值或英文名称找到其实体中文名称

    一.平常我们可以打开CRM2011一条已创建的记录,通过JScript方法获取实体英文名的方法是:按F12,输入contentIFrame.Xrm.Page.data.entity.getEntity ...