首页 / PYTHON / python学习之第十天
python学习之第十天
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python学习之第十天,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6970字,纯文字阅读大概需要10分钟。
内容图文
![python学习之第十天](/upload/InfoBanner/zyjiaocheng/740/300b28a4a8f94e09afb4ec23fa47fefd.jpg)
知识点目录
1.数据库的分类
2.数据库的常用的概念
3.sqlite3的特点
4.操作数据库的基本步骤
5.创建表基本格式
6.插入语句基本格式
7.代码执行插入的三种方式
8.删改查的基本格式
9.常用的加密方式
10.给数据库中的用户密码加密
11.用面向对象的方式封装数据库操作
1.数据库的分类
数据库分为两类
1.关系型数据库(MySql Sql Server Oracle Sqlite PostgreSQL)
2.非关系型数据库(MongDB redis memcache)
关系型:数据的存储结构一致(学院登记表)
非关系型:数据的存储结构不一致(课堂笔记)
数据库 = 存储数据的仓库(存储大量数据)
sqlite3数据库=轻量级 python自带 嵌入式数据库 跨平台
2.数据库的常用的概念
数据库必备概念
表 table 是数据库中管理数据的一个单位
连接对象
游标 cursor 对数据库的增删改查都可以通过游标实现
事务
SQL语句 StructQueryLanguage结构化查询语句,操作数据库的一种语言
3.sqlite3的特点
sqlite3数据库特点:
轻量级 python自带 嵌入式数据库 跨平台
4.操作数据库的基本步骤
import sqlite3
# 连接数据库
con=sqlite3.connect(数据库名)
# 获得游标
cursor=con.cursor()
# 进行增删改查
sql=""""""
# 关闭游标
cursor.close()
# 关闭数据库
con.close()
5.创建表基本格式
1.创建表
类型
INTEGER 整型
VARCHAR(0-255) 字符串
其它限定
NOT NULL 不许为空
UNIQUE 该列唯一 ,数据不许重复
DEFAULT 默认值
在列名两端最好加上1左边的那个引号
目的:1 防止列名与sql语句关键字重复出错
2. 列名间可以有多个单词,以空格分开
"""
sql1 = """
CREATE TABLE IF NOT EXISTS 表名 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255),
列名 类型 其它限定,
列名 类型 其它限定,
列名 类型 其它限定
);
6.插入语句基本格式
# 数据库的攻击方式之一:SQL注入
# 将需要存储的值写为sql语句
# 如何预防?
# 使用插入写法2/3
# 2.插入语句
# sqlite3只支持VALUES
# 若数据为字符串类型,则两端需要加单引号
sql2 = """
INSERT INTO 表名 (列名1, 列名2, 列名3)
VALUE/VALUES
(列名1对应的值,列名2对应的值,列名3对应的值);
try:
# 第一种插入方式
sql2 = """
INSERT INTO `student` (`name`,`age`,`phone`)
VALUES ('张三',17,'13563456677')
"""
cursor.execute(sql2)
conn.commit()
#=================================================
# 第二种插入方式
# sql2 = """
# INSERT INTO `student` (`name`,`age`,`phone`)
# VALUES (:stu_name,:stu_age,:stu_phone)
# """
# cursor.execute(sql2,
# {'stu_name':'张三',
# 'stu_age':17,
# 'stu_phone':'13563456677'
# }
# )
# conn.commit()
#=================================================
# 第三种插入方式
# sql2 = """
# INSERT INTO `student` (`name`,`age`,`phone`)
# VALUES (?,?,?)
# """
# cursor.execute(sql2,('张三',17,'13563456677'))
# conn.commit() 数据提交,增删改都需要有这行代码,不然增删改操作完成不了
except Exception as e:
print("插入失败", e)
"""
7.代码执行插入的三种方式
插入的三种方式在知识点6中
8.删改查的基本格式
"""
3.删除数据
id<4 AND id>6 (删除id 小于4和大于6的行)
.....id IN (1,3,5,6) (删除id为1,3,5,6的行)
.....name like '张%'(删除张开头的所有名字 %在sqL语句中代表所有)
DELETE FROM 表名 WHERE 条件
"""
"""
4.修改数据
UPDATE 表名 SET age=20 WHERE age>20
"""
"""
5.查询数据
SELECT * FROM 表名 WHERE 条件
*代表所有,也可以指定要查询的列
"""
"""
6.删除表(整个表删掉)
DROP TABLE 表名
7.清空表(清空表的数据)
DELETE FROM 表名
"""
9.常用的加密方式
常用的加密方式
MD5 AES DES hash+盐
md5需要依赖哪个包?
import hashlib
10.给数据库中的用户密码加密
md5需要依赖哪个包?
import hashlib
# 字符串转byte类型
# name="zhangsan"
# byte_obj=name.encode()
# byte类型转字符串
# name=byte_obj.decode()
# MD5
# 1.不可逆(只能加密不能解密)
# 解密依赖于数据库查询
# 2.加密后的数据定长(一般32位)
# 3.是一种摘要算法
def init_db():
import sqlite3
con = sqlite3.connect("user.sqlite")
cursor = con.cursor()
sql1 = """
CREATE TABLE IF NOT EXISTS user(
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_name VARCHAR(30) UNIQUE,
user_psw VARCHAR(32)
)
"""
cursor.execute(sql1)
cursor.close()
con.close()
def regist(user_name, user_psw):
print("加密前密码", user_psw)
# 先给原始密码加盐
user_psw = "./abc".join(user_psw)
print("加盐后密码", user_psw)
# md5加密
m = hashlib.md5()
m.update(user_psw.encode())
user_psw = m.hexdigest()
print("加密后密码", user_psw)
import sqlite3
con = sqlite3.connect("user.sqlite")
cursor = con.cursor()
try:
sql2 = """
INSERT INTO user (user_name,user_psw)
VALUES (?,?)
"""
cursor.execute(sql2, (user_name, user_psw))
con.commit()
print(f"{user_name}注册成功")
except Exception as e:
print(f"{user_name}已存在,请重新注册")
cursor.close()
con.close()
def login(user_name, user_psw):
import sqlite3
con = sqlite3.connect("user.sqlite")
cursor = con.cursor()
sql1 = f"""
SELECT * FROM user WHERE user_name='{user_name}'
"""
cursor.execute(sql1)
user = cursor.fetchall() # 返回值为列表中有元组 如[(user_name,user_psw)]
if not user:
print("用户名不存在")
else:
user = user[0] # user[0] 为元组(user_name,user_psw)
# md5加密
m = hashlib.md5()
m.update(user_psw.encode())
user_psw = m.hexdigest()
if user[2] == user_psw: # user[2]得到的是user_psw
print("登录成功")
else:
print("密码不正确!请重新输入")
cursor.close()
con.close()
init_db()
regist("1608253627@qq.com", 'liuzhan')
regist("1608253627@qq.com", 'liuzhan123')
login("1234790097@qq.com", 'liu123')
login("1608253627@qq.com", 'liu123')
login("1608253627@qq.com", 'liuzhan')
# sql注入
# select * from user where user_name='';
# select * from user where user_name='' or '1'='1';
regist("53234889@qq.com", 'liuzhan')
login("53234889@qq.com", 'liuzhan')
11.用面向对象的方式封装数据库操作
# 面向对象的方式
import sqlite3
class DBTool(object):
def __init__(self, db_name="db.sqlite"):
print("初始化对象")
self.__db_name = db_name
# lazyload=懒加载=用到的时候在创建
self.get_con()
self.get_cursor()
def close_all(self):
print("关闭连接")
self.__cursor.close()
self.__con.close()
self.__cursor = None
self.__con = None
def __del__(self):
self.close_all()
def get_con(self):
print("获取连接对象")
con = sqlite3.connect(self.__db_name)
self.__con = con
return con
def get_cursor(self):
print("获取游标对象")
cursor = self.__con.cursor()
self.__cursor = cursor
return cursor
def create_table(self,sql):
self.__cursor.execute(sql)
print("创建表成功")
def drop_table(self,table_name):
# 删除表要慎重
# 1)表是否存在 2)表中数据怎么办
sql=f"""
DROP TABLE IF EXISTS {table_name}
"""
self.__cursor.execute(sql)
self.__con.commit()
print("删除表成功")
def insert(self,sql,params=None):
for param in params:
self.__cursor.execute(sql,param)
self.__con.commit()
print("插入成功")
def delete(self,sql):
self.__cursor.execute(sql)
self.__con.commit()
def update(self,sql,param=None):
self.__cursor.execute(sql,param)
self.__con.commit()
def fetch_one(self,sql,param):
self.__cursor.execute(sql, param)
return self.__cursor.fetchone()
def fetch_all(self,sql,param=''):
self.__cursor.execute(sql, param)
return self.__cursor.fetchall()
db = DBTool("stu_info.db")
db.create_table("""CREATE TABLE IF NOT EXISTS a(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20))""")
# db.drop_table('a')
# db.drop_table('b')
db.insert("INSERT INTO a (name) VALUES (?)",(("张三",),))
db.insert("INSERT INTO a (name) VALUES (?)",(("李四",),("王五",)))
db.delete("DELETE FROM a WHERE name like '张%'")
db.update("UPDATE a SET name=? WHERE id>1",('张三',))
db.fetch_one("SELECT * FROM a WHERE name=?",('张三',))
db.fetch_all(f"SELECT * FROM a WHERE name=?",("张三",))
内容总结
以上是互联网集市为您收集整理的python学习之第十天全部内容,希望文章能够帮你解决python学习之第十天所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。