• MySQL— pymysql模块(防止sql注入),可视化软件Navicat


    一.Pymysql

    import pymysql
    #python2.X 中是 mysqldb 和 pythonmysql 用法是一模一样的
    #pymysql可以伪装成上面这两个模块
    
    user = input('username: ')
    pwd = input('password: ')
    
    #连接数据库
    conn = pymysql.connect(host='localhost',user='root',password='gkx321',database='db222')
    cursor = conn.cursor() #类似文件句柄。 比如conn是打开了一个柜子,cursor就是我们拿东西的手
    # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #设置为字典格式,fetch的时候可以显示字段名,以字典形式
    
    #注意以后绝对不要这么拼接
    # sql =  "select * from userinfo where username='%s' and password = '%s' "%(user,pwd)
    # username: uu' or 1=1 --
    # password: gkx
    # (1, 'gkx', 'gkx123')
    # 登陆成功
    
    #正确方式
    sql =  "select * from userinfo where username = %s and password = %s "
    
    #三种方式 元组,列表,字典
    # cursor.execute(sql)
    cursor.execute(sql,(user,pwd))  #执行语句  ,末尾加不加逗号都行
    #r = cursor.execute(sql,(user,pwd))  #有个返回值,表示受影响的行数
    
    # cursor.execute(sql,[user,pwd])
    
    # sql =  "select * from userinfo where username = %(u)s and password = %(p)s "
    # cursor.execute(sql,{'u':user,'p':pwd})
    
    ret = cursor.fetchone() #fetchone类似 readline 运行一次,只读取一行。
    print(ret)
    
    cursor.close()
    conn.close()
    if ret:
        print('登陆成功')
    else:
        print('登陆失败')
    pymysql初识
    #总结
        #查询需要 fetchone
        #更新和insert 需要 conn.commit()
        #create drop alter 只要 cursor.execute()
    import pymysql
    
    conn = pymysql.connect(host='localhost',user='root',password='gkx321',database='db222')
    # cursor = conn.cursor() #类似文件句柄。 比如conn是打开了一个柜子,cursor就是我们拿东西的手
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #设置为字典类型的 cursor
    '''
    #增加 删除 改
    # user = 'ccc'
    # pwd = 'ccc123'
    sql =  "insert into userinfo(username,password) values(%s,%s)"
    # cursor.execute(sql,(user,pwd,))
    cursor.executemany(sql,[('ww','ww123'),('aaa','aaa123')]) #增加多行,只适合insert时候用
    # r = cursor.execute(sql,(user,pwd,)) #返回值,受影响的行数
    conn.commit() #增删改 三种操作一定要 commit 不提交数据库不知道要修改
    for 循环中 可以 全部execute后,再进行一次 commit
    '''
    
    #
    sql = "select * from userinfo"
    cursor.execute(sql)
    
    # 既然fetchone像文件中的readline,那么就有类似 tell和seek的语句:
    cursor.scroll(2,mode='relative')  #根据当前位置,相对移动 .2表示从当前位置,选择下下行,自然1就是选择下一行了
    cursor.scroll(2,mode='absolute')  #根据绝对位置移动       2表示从第1行往后的2行,即表示选择第3行
    
    #可以通过设置cursor,来让fetchone显示的时候,带上字段名,以字典形式
    ret = cursor.fetchone() #只有查询的时候才需要
    print(ret)
    ret = cursor.fetchone()
    print(ret)
    ret = cursor.fetchall()
    print(ret)
    #
    # ret1 = cursor.fetchall()  #返回一个元组,每条数据又是一个元组
    # print(ret1)
    
    #要注意的是,尽量还是要用sql语句操作,因为比如fetchall/fetchmany 会把所有数据放到内存中来,比如10万条数据,那么是相当占内存的
    #还是建议用 sql中的 limit 分页
    # ret1 = cursor.fetchall()
    # ret2 = cursor.fetchmany(3)
    
    
    cursor.close()
    conn.close()
    pymysql—增删改查
    #新插入数据的自增id  cursor.lastrowid
    import pymysql
    
    conn = pymysql.connect(host='localhost',user='root',password='gkx321',database='db222')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    
    sql = "insert into userinfo(username,password) values('ddd','ddd123')"
    cursor.execute(sql)
    print(cursor.lastrowid) #
    #获取插入数据的自增id
    #那如果是插入多行呢,也只获取最后一行的 自增id,所以有需要外键的话,只能一个个插入再获取
    conn.commit()
    
    cursor.close()
    conn.close()
    新插入数据的自增id
    import pymysql
    import sys
    conn = pymysql.connect(host='localhost',user='root',password='gkx321',database='db222')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    
    
    def select(sql,cursor,conn):
        ret = cursor.execute(sql)
        print('受影响行数为%s行'%ret)
        ret2 = cursor.fetchall()
        return ret2
    
    def drop(sql,cursor,conn):
        ret = cursor.execute(sql)
        return '33[34m操作成功33[0m'
    
    def change(sql,cursor,conn):
        ret = cursor.execute(sql)
        conn.commit()
        if ret:
            return '33[34m受影响行数为%s行33[0m'%ret
        else:
            print('输入不正确')
            return False
    
    # def quit(sql, cursor, conn):
    #     print('退出了')
    #     exit()
    def login(cursor,conn):
        count = 0
        while count<3:
            user = input('用户名:')
            pwd = input('密码:')
            sql = "select * from user where username=%s and password=%s"
            ret = cursor.execute(sql,(user,pwd))
            if ret:
                sql = "select * from u_g left join grant_info on u_g.g_id = grant_info.id left join user on u_g.u_id = user.id;"
                cursor.execute(sql)
                ret = cursor.fetchall()
                for line in ret:
                    if line['username'] == user:
                        print('%s的权限是%s'%(line['username'],line['grant_lst']))
                return True
            else:
                print('用户信息有误')
                count += 1
        return False
    
    
    
    def op():
        while True:
            menu = [('查询','select'),
                    ('增加','change'),
                    ('新建表','drop'),
                    ('删除','drop'),
                    ('更新','change'),
                    ('退出','')
                    ]
            for index,item in enumerate(menu,1):
                if index < len(menu):
                    print('%s:%s'%(index,item[0]),end='  ')
                else:
                    print('%s:%s'%(index,item[0]))
            try:
                choi = int(input('选择操作序号:'))
                if choi == 6:
                    print('33[31m已选择退出33[0m')
                    break
                print('33[32m进行%s操作33[0m' % menu[choi - 1][0])
            except:
                print('33[31m选择有误,请输入序号33[0m')
                continue
            print('33[34m输入sql语句,或者按q返回33[0m')
            sql = input('输入sql命令>>:')
            if sql == 'q':
                continue
    
            try:
                func = getattr(sys.modules[__name__], menu[choi - 1][1])
                ret = func(sql, cursor, conn)
                if choi != 1:
                    print(ret)
                else:
                    for index,item in enumerate(ret):
                        print(item)
            except:
                print('33[31m语法有误,重新输入33[0m')
    
    
        cursor.close()
        conn.close()
    
    
    ret = login(cursor, conn)
    if ret:
        op()
    pymysql作业1

    pymysql作业1:简单实现用pymysql进行数据库管理

    import random
    import pymysql
    
    conn = pymysql.connect(host='localhost',user='root',password='gkx321',database='db300w',charset='utf8')
    cursor = conn.cursor()
    
    #
    # name = 'alex'
    # emai = 'email'
    # for i in range(0,2000000):
    #     i = str(i)
    #     gender = random.choice(['男', '女'])
    #     sql = "insert into userinfo(name,email,gender) values(%s,%s,gender)"
    #     cursor.execute(sql % (name+i,emai+i))
    # conn.commit()
    #
    # cursor.close()
    # conn.close()
    
    name = 'alex'
    emai = 'email'
    for i in range(3,3000001):
        gender = random.choice(['', ''])
        sql = " update userinfo set gender='%s' where id =%s;"% (gender,i)
        cursor.execute(sql)
    conn.commit()
    
    cursor.close()
    conn.close()
    
    #sql 拼接的时候,如果 %s 不加单引号,那么sql语句里也不会有单引号
    pymysql作业2

    pymysql作业2:用pymysql向表格插入300万条数据

    # ===>要先问清楚,要求是什么:公司开发一个项目,假设100天,可能有70天在明确需求
    # 1. 基于角色的权限管理
    # 2. 明确需求分析
    
    
    # 基于角色的权限管理
    #
    # 用户信息
        # id username     pwd     role_id
        # 1   alex     123123      1
        # 2   eric     123123      1
    #
    # 权限
        # 1    订单管理
        # 2    用户劵
        # 3    Bug管理
    # ....
    #
    # 角色表:
        # 1    IT部门员工
        # 2    咨询员工
        # 3    IT主管
    #
    # 角色权限管理
       #角色   #权限
        # 1     1
        # 1     2
        # 3     1
        # 3     2
        # 3     3
    
    #那如果一个用户有多个角色呢,可以再多一个表 角色和用户关系表
    作业心得

    要先问清楚,要求是什么:公司开发一个项目,假设100天,可能有70天在明确需求

    import pymysql
    
    conn = pymysql.connect(host='localhost',user='root',password='gkx321',database='sql_homework',charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    
    cursor.callproc('p3',(12,2)) #n1是12,无所谓n2是多少,不影响
    ret = cursor.fetchall()
    print(ret)
    
    #out的值要这么获取,固定写法
    cursor.execute('select @_p3_0,@_p3_1') #可以只写一个 0获取n1,1获取n2
    ret = cursor.fetchall()
    print(ret)
    
    '''
    为什么格式是这样呢,因为pymysql内部帮我们做了这样子的操作
    set @ _p3_0 = 12
    set @ _p3_1 = 2
    call p3( @ _p3_0,@_p3_1)
    select @ _p3_0,@_p3_1
    '''
    
    # cursor.execute('select * from teacher')
    # ret = cursor.fetchall()
    # print(ret)
    
    cursor.close()
    conn.close()
    Pymysql-存储过程的操作
    # http://www.runoob.com/mysql/mysql-sql-injection.html
    # https://www.cnblogs.com/sdya/p/4568548.html
    
    # sql =  "select * from userinfo where username='%s' and password = '%s' "%(user,pwd)
    #如果我们这么拼接字符串
    # 当 %s 传入为  uu' or 1=1 -- 那么sql语句变为
    
    # sql =  "select * from userinfo where username='uu' or 1=1 -- ' and password = '%s' "%(user,pwd) (-- 为sql中的注释符号)
    # 从而让sql变得不安全,可以随便登陆
    
    具体见 上面例子中,《pymysql初识》
    mysql注入

    二.navicat是MySQL其中一个可视化软件

    #·······建议还是用终端使用MySQL·······
    
    #通过以下2步才能用 8.0登陆 navicat:
    # mysql加密规则  https://www.cnblogs.com/atuotuo/p/9402132.html
    #  ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'gkx321';
                        # 把mysql 8.0加密规则 从caching_sha2_password 更改为 mysql_native_password
    #  Update user set host='%' where user='root';
    # select user,host,plugin from user
    
    #我们用navicat这个IDE,主要还是为了学习过程中,存储和查看命令
    #生产过程中一定不要用,会被鄙视。
    '''
    #1.转储数据库文件:
        #对着db右键,可以把数据库的结构和数据导出
        #导入的话,直接新建查询,把sql的文件粘贴进入,运行即可。
    
        #那在终端要怎么备份呢?
            #用 mysqldump
            #备份:数据表结构和数据
                #打开cmd 输入命令: mysqldump -u root db1 > db1.sql -p 回车输入密码即可
                #保存位置在 cmd行输入时候的路径,文件名为 db1.sql
            #只备份:数据表结构:
                #mysqldump -u root -d db1 > db1.sql -p  #多了个  -d
        #那备份的怎么导入呢?
            #首先创建一个数据库 create database db_name;
            #命令: mysqldump -uroot -p密码 db_name < 文件路径
    '''
    navicat初识
    D:python-全栈九期
    avicat12
    安装包
  • 相关阅读:
    小技巧-WEB API第一次加载很慢
    20165313 《Java程序设计》第一周学习总结
    spring-boot源码分析之BeanFactory · 叁
    spring-boot源码分析之BeanFactory · 贰
    aaa
    JavaScript FSO属性大全
    IE浏览器下用JS创建文件
    FileSystemObject详解
    HTTP状态码
    Spring中异步执行方法(@Async)
  • 原文地址:https://www.cnblogs.com/gkx0731/p/9820599.html
Copyright © 2020-2023  润新知