python连接数据库(pymysql)及数据库加密
内容:
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)及数据库加密的更多相关文章
- 3.Python连接数据库PyMySQL
1.安装PyMySQL,输入命令:pip3 install PyMySQL 2.使用Navicat,创建数据库:TESTDB,表:EMPLOYEE,字段:FIRST_NAME,LAST_NAME,AG ...
- Python使用PyMysql操作数据库
安装 pip install -U pymysql 连接数据库 连接数据库有两种不同的格式 直接使用参数 代码如下 import pymysql.cursors connection = pymysq ...
- python 连接数据库 pymysql模块的使用
一 Python3连接MySQL 本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用. 1 PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MyS ...
- python通过pymysql实现数据库的增删改查
今天实现了python对于数据库的增删改查工作: 具体的每一步的数据库的增删盖茶自己都实验过了. 掌握了基本的数据库操作语言.然后就是对于tuple()的认识. 以及对于查询语句中的:fetchone ...
- Python操作pymysql写入数据库时的错误
错误一 InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xE6\\xAD\\xA3 ...
- python之pymysql模块学习(待完善...)
pymysql介绍 pymysql是在python3.x版本中用于连接mysql服务器的一个库.python2中则使用mysqldb. 安装方法: pip install pymysql 使用实例: ...
- Python全栈 MySQL 数据库 (引擎、事物、pymysql模块、orm)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 存储引擎(处理表的处理器) 基本操作: ...
- 百万年薪python之路 -- MySQL数据库之 Navicat工具和pymysql模块
一. IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接 ...
- Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁
Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁 一丶安装 pip install PyMySQL 二丶pymysql连接数据库 ### 语法: ...
随机推荐
- Qemu编译qemu-system-arm
/********************************************************************************* * Qemu编译qemu-syst ...
- git中的标签
/*游戏或者运动才能让我短暂的忘记心痛,现如今感觉学习比游戏和运动还重要——曾少锋*/ 1.创建标签: 对于标签来说大家都很熟悉,简单说就是将一个很长的门牌号用另外一个名字来取代,并且好记. 其实利 ...
- 20分钟打造你的Bootstrap站点
来源:http://www.w3cplus.com/css/twitter-bootstrap-tutorial.html 特别声明:此篇文章由白牙根据Leon Revill的英文文章原名<Tw ...
- JQuery禁止回车提交表单
//禁止回车键提交表单——动态绑定 $(function(){ $("input").on('keypress', //所有input标签回车无效,当然,可以根据需求自定义 fu ...
- test20180921 量子纠缠
题意 问题描述 万能的红太阳J 君正在研究量子信息的纠缠. 具体来说,J 君有一个初始为空的信息集.她会进行m 次操作,有时,她会向信息集内加入一个长度不超过L 的的数字串(一个数字串为一个仅由0 到 ...
- dockercompose up build fail (node no such file or directory packages.json )
docker构建项目遇到如下问题: npm ERR! Darwin 15.0.0 npm ERR! argv "/usr/local/lib/node_modules/iojs-bin/no ...
- Oracle:Decode在时间范围中的使用
做查询的时候需要下一个sql,需要select test_time出来,如果test_Time的HH24:Mi:SS在7:00:00和19:00:00返回白班,否则返回夜班 select case w ...
- FastAdmin 开发第一天:了解 FastAdmin 框架
了解 FastAdmin 框架 后端组件 ThinkPHP 5 EasyWeChat qr-code 前端组件 AdminLTE bootstrap bootstrap-table jquery la ...
- python 网络编程要点
From http://www.zhihu.com/question/19854853 Python网络编程是一个很大的范畴,个人感觉需要掌握的点有:1. 如何使用Python来创建socket, 如 ...
- webpack externals
当我们想在项目中require一些其他的类库或者API,而又不想让这些类库的源码被构建到运行时文件中,这在实际开发中很有必要.此时我们就可以通过配置externals参数来解决这个问题: //webp ...