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连接数据库 ### 语法: ...
随机推荐
- DelaunayTriangulation_VoronoiDiagram_using_OpenCV的实现
前言 最近project中有关于delaunay的实现问题,查找资料,看到learnopencv这个网站,有很多peoject的实现,本文主要是实现Delaunay Triangulation and ...
- ElasticSearch(六):IK分词器的安装与使用IK分词器创建索引
之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字段分成一个一个汉字,然后搜索的时候也会把搜索的句子进行分词,所以这里就需要更加智能的分词器IK分词器了. 1. i ...
- [Boolan-C++学习笔记]第一周整理
1.两种典型类 Complex 无指针 String 有指针 编写思路差异较大 2.使用Class声明:Object Based.类与类之间的关系:Object Oriented 3.头文件的布局 # ...
- 在windows下制作mac os x的启动安装U盘
前几天有幸用了下Macbook pro,可在给它装win 7系统时,无知而又手贱地在windows系统下分区了:( 然后再重启就找不到Mac os x,只有win 7了.可进win 7也不正常,直接给 ...
- hdu2083 简易版之最短距离 排序水题
给出数轴n个坐标,求一个点到所有点距离总和最小.排序后最中间一个点或两个点之间就是最优 #include<stdio.h> #include<algorithm> using ...
- (转) C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...
- dgraph 基本查询语法 三
这部分主要是查询块.查询变量.聚合操作 多名称查询 实际上就是类似多个查询数据的拼接 格式: { caro(func: allofterms(name@en, "Marc Caro" ...
- Javascript Array 方法整理
Javascript Array 方法整理 Javascript 数组相关方法 说明 大多数其它编程语言不允许改变数组大小,越界访问索引会报错,但是 javascript不会报错,不过不建议直接修改a ...
- Servlet 实现网页计数器
创建CounterSerlet, 使用getServletContext,ServletContext 从request.getSession().getServletContext();获得 @We ...
- JSP中的MVC
如下图