day06 python操作数据库 实现用户登录

day06 python操作数据库 实现用户登录

内容回顾

查询关键字

limit  分页 :限制数据的显示行数
	limit 数字1 		:从第0行开始到第一个数字的行
	limit 数字1 数字2  :从数字1行开始,显示数字2个行

多表查询

连表操作
	两个表拼接在一起 然后单表查询 on 指定两个表拼接的依据 那个字段相等
	inner join 内连接
	left join 左连接
	right join 右连接
	select * from emp inner join dep on emp.dep_id = dep.id;
子查询
	一条sql语句的查询结果用于另一条sql语句的条件
	#分布操作 先干这个 在干那个

可视化软件使用

能够充当数据库客户端的可视化软件其实也有很多
	操作MySQL最为方便的当属Navicat(收费 破解版)
   
"""该软件底层操作其实还是SQL语句"""
1.连接数据库
2.查看数据库 表 记录
3.创建数据库 表 记录
4.设计表
5.添加外键(还支持修改SQL)
6.逆向数据库到模型
7.转储SQL文件

今日内容概要

多表查询练习

python操作mysql

基于python与mysql实现用户注册登录

今日内容详细

多表查询练习

-- 7、 查询没有报李平老师课的学生姓名
#需要老师表 课程表 成绩表 学生表
#先找李平老师课程id
-- select course.cid from teacher INNER JOIN course on teacher.tid=course.teacher_id WHERE teacher.tname='李平老师'
#通过课程id去成绩表找上了李平老师课程的同学id

-- select distinct student_id from score where course_id  in (select course.cid from teacher INNER JOIN course on teacher.tid=course.teacher_id WHERE teacher.tname='李平老师') 

#通过id 去找没有



-- 8、 查询没有同时选修物理课程和体育课程的学生姓名
#需要三张表
#先找物理课和体育课程的课程id
-- select cid from course WHERE cname in ('物理','体育')

#在成绩表找有 物理课程和体育课程学生的id

-- select student_id as a1 from score WHERE course_id in (select cid from course WHERE cname in ('物理','体育')) GROUP BY student_id having COUNT(course_id)=1

-- select sname from student where sid in (select student_id as a1 from score WHERE course_id in (select cid from course WHERE cname in ('物理','体育')) GROUP BY student_id having COUNT(course_id)=1
-- )
-- 
-- 9、 查询挂科超过两门(包括两门)的学生姓名和班级
#两张表

#先找挂科超过两门的学生id 

-- select student_id from score where num <60 GROUP BY student_id HAVING count(num)>=2



#通过班级id 找对应班级
select student.sname,class.caption from class INNER JOIN student on student.class_id=class.cid where student.sid in (select student_id from score where num <60 GROUP BY student_id HAVING count(num)>=2)

python代码操作mysql

python  也叫做 胶水语言、调包侠(贬义词>>>褒义词)
python厉害的是他的模块、软件

#python代码操作mysql 主要使用了一个叫做 pymysql的模块
import pymysql  #导入pymysql模块


#定义一个连接对象
conn=pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    charset='utf8',          #这里不能写utf-8   语法规范
    database='db5_1'
)


#定义一个游标 类似于cmd mysql 里面等你输入sql语句的命令行 (里面的保证了cursor.fetchall 获取的是字典)
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
#定义sql语句
sql="select * from userinfo"
#执行sql语句
aa=cursor.execute(sql)  #返回值是受影响的行数 execute 执行sql语句

print(aa)
#获取执行结果 是服务端返回给我们的结果 再进行二次过滤,获取全部 或者一行或者几行 取文件是根据光标取得 读取一次光标移动一次
cursor.scroll(1,'relative') #相对当前位置移动一格 光标在1 获取是从2开始获取
# cursor.scroll(0,'absolute') #相对开始位置移动0格

#res=cursor.fetchall() #fetchall 获取执行结果  返回列表套字典
#res=cursor.fetchone() #fetchone  获取返回结果的第一行数据  返回字典
res=cursor.fetchmany(2) #fetchmany 获取执行结果两行  数字是几就返回几行   返回列表套字典
print(res)

sql注入问题

import pymysql  #导入pymysql模块


#定义一个连接对象
conn=pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    charset='utf8',          #这里不能写utf-8   语法规范
    database='db5_1'
)
#定义游标对象
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)

while True:
    #获取用户名密码
    #sql注入其实就是通过一些特殊符号的组合,达到某些特定目的,避免常规的逻辑
    username=input('请输入用户名:').strip()   #zhang '-- asdasdasd 发现输入用户名就可以登录
    password=input('请输入密码:').strip()    # zhang ' or 1=1 -- asdasdasd  用户名错误可以登录
    #组成sql语句  核心数据不要自己拼接 交给execute方法来筛选拼接 只支持%s
    # sql="select * from userinfo where name='%s' and password='%s'"%(username,password)
    sql="select * from userinfo where name=%s and password=%s"
    print(sql)
    #判断是否存在  excute 可以解决sql注入问题
    res=cursor.execute(sql,(username,password))
    res1=cursor.fetchall()
    if res1 :   #res 或者res1 都可以 返回值
        print("登陆成功")
    else:
        print('账号或者密码错误')


增删改二次确认

import pymysql  #导入pymysql模块


#定义一个连接对象
conn=pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    charset='utf8',          #这里不能写utf-8   语法规范
    database='db5_1',
    autocommit=True       #二次确认增删改操作
)



#定义游标
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)

#编写sql语句
sql1='select * from userinfo'
sql2='insert into userinfo(name,password) values(%s,%s)'
sql3='update userinfo set name=%s where id=1'
sql4='delete from userinfo where id=2'

#执行sql语句
# cursor.execute(sql1)
#cursor.executemany(sql2,[('zhang111',123),('zhang222',321),('zhang333',222)])
# #多次执行一条sql语句 比如添加 但是添加内容不同 可以用这个

res=cursor.execute(sql2,('uzi',666))

#
# res=cursor.execute(sql3,('rng'))
#
# res=cursor.execute(sql4)

#获取执行结果

res1=cursor.fetchall()
print(res)
print(res1)


conn.close 

基于python与mysql实现完整用户注册登录

def register(cursor):
    #获取用户名密码
    username=input('请输入你要注册的用户:').strip()

    #先判断用户是否存在
    sql='select * from userinfo where name=%s'
    cursor.execute(sql,(username,))
    res=cursor.fetchall()
    #如果不存在
    if not res:
        #设置添加sql语句
        password = input('请输入密码:').strip()
        sql1 ='insert into userinfo(name,password) values(%s,%s)'
        cursor.execute(sql1,(username,password))
        print('用户%s注册成功'%username)
    else:
        print('用户已存在')


def login(cursor):
    #获取用户名
    username=input('请输入你要登录的用户:').strip()
    #查询用户名是否存在
    sql='select * from userinfo where name=%s'
    #执行sql语句
    cursor.execute(sql,(username,))
    res=cursor.fetchall()
    if res:
        password = input('请输入密码:').strip()
        sql1='select * from userinfo where name=%s and password=%s'
        cursor.execute(sql1,(username,password))
        res1=cursor.fetchall()
        if res1:
            print('用户%s登录成功'%username)
        else:
            print('密码错误')
    else:
        print('用户%s不存在'%username)

# def login(cursor):  #第二种登录方法
#     # 获取用户名和密码
#     username = input('username>>>:').strip()
#     password = input('password>>>:').strip()
#     # 先获取是否存在用户名相关的数据
#     sql = 'select * from userinfo where name=%s'
#     cursor.execute(sql, (username,))
#     res = cursor.fetchone()
#     #res = cursor.fetchall()
#     #也可以写fetchall 那样得到的就是一个列表套字典
#
#     if res:
#         # 校验密码
#         # real_dict = res[0]  #列表第一个元素取出来,是一个字典
#         # if password == str(real_dict.get('password')):   获取字典的key==password和输入的密码比较
#         if password == str(res.get('password')):
#             print('登录成功')
#         else:
#             print('密码错误')
#     else:
#         print('用户名不存在')



def loginout(cursor):
    print('退出成功')
    exit()

def get_conn():
    import pymysql
    #创建连接对象
    conn=pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        charset='utf8',
        database='db5_1',
        autocommit=True
    )
    #创建游标对象
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#数据自动组织成字典
    return cursor


func_dic={
     '1':register,'2':login, '3' : loginout}
while True:
    print('''
    1.注册功能
    2.登录功能
    3.退出
    ''')
    cursor=get_conn()
    choise= input("请输入你选择的功能:").strip()
    if choise in func_dic:
        func_name=func_dic.get(choise)
        func_name(cursor)
    else:
        print("你输入的编号有误,请重新输入")

你可能感兴趣的:(mysql,数据库,python,mysql)