内容:

1.pymysql介绍

2.pymysql基本使用

3.数据库加密

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

1.pymysql介绍

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

安装:

  1. pip3 install pymysql

2.pymysql基本使用

(1)预备知识:SQL

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

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

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

  1. import pymysql
  2.  
  3. # 创建连接
  4. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  5. # 创建游标
  6. cursor = conn.cursor()
  7.  
  8. # 执行SQL,并返回收影响行数
  9. effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
  10.  
  11. # 执行SQL,并返回受影响行数
  12. #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
  13.  
  14. # 执行SQL,并返回受影响行数
  15. #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  16.  
  17. # 提交,不然无法保存新建或者修改的数据
  18. conn.commit()
  19.  
  20. # 关闭游标
  21. cursor.close()
  22. # 关闭连接
  23. conn.close()

(3)对以上过程的封装

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

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

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

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

  1. # __author__ = "wyb"
  2. # date: 2018/8/20
  3. import pymysql
  4.  
  5. # 创建数据库中的表
  6. def create(conn):
  7. # 注意 CREATE TABLE 这种语句不分大小写
  8. sql_create = '''
  9. CREATE TABLE `users` (
  10. `id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  11. `username` VARCHAR(200) NOT NULL UNIQUE,
  12. `password` TEXT NOT NULL,
  13. `email` TEXT
  14. )
  15. '''
  16. # 用 execute 执行一条 sql 语句
  17. conn.execute(sql_create)
  18. print('创建成功')
  19.  
  20. # 向数据库中插入数据
  21. def insert(conn, username, password, email):
  22. sql_insert = '''
  23. INSERT INTO
  24. users(username,password,email)
  25. VALUES
  26. (%s, %s, %s);
  27. '''
  28. # 参数拼接要用 %s,execute 中的参数传递必须是一个 tuple 类型
  29. conn.execute(sql_insert, (username, password, email, ))
  30. print('插入数据成功')
  31.  
  32. # 查询数据
  33. def select(conn):
  34. sql = '''
  35. SELECT
  36. *
  37. FROM
  38. users
  39. '''
  40. # 这是读取数据的套路
  41. conn.execute(sql)
  42. res = conn.fetchall()
  43. print("所有数据如下: ")
  44. for row in res:
  45. print(row)
  46.  
  47. # 删除数据
  48. def delete(conn, user_id):
  49. sql_delete = '''
  50. DELETE FROM
  51. users
  52. WHERE
  53. id=%s
  54. '''
  55. # 注意, execute 的第二个参数是一个 tuple
  56. # tuple 只有一个元素的时候必须是这样的写法
  57. conn.execute(sql_delete, (user_id,))
  58. print("删除数据成功")
  59.  
  60. # 更新数据
  61. def update(conn, user_id, email):
  62. sql_update = '''
  63. UPDATE
  64. `users`
  65. SET
  66. `email` = %s
  67. WHERE
  68. `id`= %s
  69. '''
  70. conn.execute(sql_update, (email, user_id))
  71. print("更新数据成功")
  72.  
  73. # 主程序
  74. def main():
  75. # 指定数据库名字并打开 -> 没有会自动创建
  76. # 创建连接
  77. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='wyb')
  78. print("打开数据库wyb")
  79. # 创建游标
  80. cursor = conn.cursor()
  81.  
  82. # create 创建表结构 -> 注意创建表只能创建一次 创建已创建的表会报错
  83. # create(cursor)
  84.  
  85. # insert 插入数据 -> 注意插入一次后下面的数据就不能再插入 因为用户名有限制(unique)
  86. # insert(cursor, 'wpz', '123', 'tggh@b.c')
  87.  
  88. # delete 删除数据
  89. # delete(cursor, 1)
  90.  
  91. # update 更新数据
  92. # update(cursor, 4, 'woz_wyb@qq.com')
  93. # select 查询数据
  94. # select(cursor)
  95.  
  96. # 最后提交: 必须用 commit 函数提交你的修改 否则你的修改不会被写入数据库
  97. conn.commit()
  98. # 用完数据库要关闭
  99. cursor.close()
  100. conn.close()
  101.  
  102. if __name__ == '__main__':
  103. main()

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

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

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

(4)fetch数据类型

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

  1. import pymysql
  2.  
  3. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  4.  
  5. # 游标设置为字典类型
  6. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  7. r = cursor.execute("call p1()")
  8.  
  9. result = cursor.fetchone()
  10.  
  11. conn.commit()
  12. cursor.close()
  13. conn.close()

3.数据库加密

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

(1)数据库加密方法

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

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

(2)加密实例

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

  1. class User(Model):
  2. """
  3. User 是一个保存用户数据的 model
  4. 现在只有两个属性 username 和 password
  5. """
  6. def __init__(self, form):
  7. self.id = form.get('id', None)
  8. self.username = form.get('username', '')
  9. self.password = form.get('password', '')
  10.  
  11. # 加盐加密
  12. @staticmethod
  13. def salted_password(password, salt="`1234567890~!@#$%^&*()-=[];'\/,./ZXCVBNSADFYWQET"):
  14. # salt: "`1234567890~!@#$%^&*()-=[];'\/,./ZXCVBNSADFYWQET"
  15. def md5hex(ascii_str):
  16. return hashlib.md5(ascii_str.encode('ascii')).hexdigest()
  17.  
  18. # 普通加密
  19. hash1 = md5hex(password)
  20. # 加盐加密
  21. hash2 = md5hex(hash1 + salt)
  22. return hash2
  23.  
  24. # 注册
  25. def validate_register(self):
  26. pwd = self.password
  27. self.password = self.salted_password(pwd)
  28. # 用户名已存在就不允许注册 否则可以注册
  29. if User.find_by(username=self.username) is None:
  30. self.save()
  31. return self
  32. else:
  33. return None
  34.  
  35. # 登录
  36. def validate_login(self):
  37. u = User.find_by(username=self.username)
  38. if u is not None:
  39. return u.password == self.salted_password(self.password)
  40. else:
  41. return False
  42.  
  43. # 修改密码
  44. def change_pwd(self, form):
  45. # 输入两次旧密码不一样
  46. pwd1 = form.get("pwd1", "")
  47. pwd2 = form.get("pwd2", "")
  48. if pwd1 != pwd2:
  49. res = {
  50. "msg": "两次输入的旧密码不一样",
  51. "data": None,
  52. }
  53. return res
  54.  
  55. # 输入的旧密码正确就重置 否则就不重置
  56. new_pwd = form.get("new_pwd", "")
  57. if self.salted_password(pwd1) == self.password:
  58. self.password = self.salted_password(new_pwd)
  59. self.save()
  60. res = {
  61. "msg": "重置密码成功",
  62. "data": self,
  63. }
  64. else:
  65. res = {
  66. "msg": "输入的旧密码错误!",
  67. "data": None,
  68. }
  69. 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. Qemu编译qemu-system-arm

    /********************************************************************************* * Qemu编译qemu-syst ...

  2. git中的标签

     /*游戏或者运动才能让我短暂的忘记心痛,现如今感觉学习比游戏和运动还重要——曾少锋*/ 1.创建标签: 对于标签来说大家都很熟悉,简单说就是将一个很长的门牌号用另外一个名字来取代,并且好记. 其实利 ...

  3. 20分钟打造你的Bootstrap站点

    来源:http://www.w3cplus.com/css/twitter-bootstrap-tutorial.html 特别声明:此篇文章由白牙根据Leon Revill的英文文章原名<Tw ...

  4. JQuery禁止回车提交表单

    //禁止回车键提交表单——动态绑定 $(function(){ $("input").on('keypress',  //所有input标签回车无效,当然,可以根据需求自定义 fu ...

  5. test20180921 量子纠缠

    题意 问题描述 万能的红太阳J 君正在研究量子信息的纠缠. 具体来说,J 君有一个初始为空的信息集.她会进行m 次操作,有时,她会向信息集内加入一个长度不超过L 的的数字串(一个数字串为一个仅由0 到 ...

  6. 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 ...

  7. Oracle:Decode在时间范围中的使用

    做查询的时候需要下一个sql,需要select test_time出来,如果test_Time的HH24:Mi:SS在7:00:00和19:00:00返回白班,否则返回夜班 select case w ...

  8. FastAdmin 开发第一天:了解 FastAdmin 框架

    了解 FastAdmin 框架 后端组件 ThinkPHP 5 EasyWeChat qr-code 前端组件 AdminLTE bootstrap bootstrap-table jquery la ...

  9. python 网络编程要点

    From http://www.zhihu.com/question/19854853 Python网络编程是一个很大的范畴,个人感觉需要掌握的点有:1. 如何使用Python来创建socket, 如 ...

  10. webpack externals

    当我们想在项目中require一些其他的类库或者API,而又不想让这些类库的源码被构建到运行时文件中,这在实际开发中很有必要.此时我们就可以通过配置externals参数来解决这个问题: //webp ...