• MySQL->navicat、pyMySQL


    MySQL->navicat、pyMySQL

    #1. 测试+链接数据库
    #2. 新建库
    #3. 新建表,新增字段+类型+约束
    #4. 设计表:外键
    #5. 新建查询
    #6. 备份库/表
    
    #注意:
    批量加注释:ctrl+?键
    批量去注释:ctrl+shift+?键
    

    PyMySQL模块

    安装—> pip3 install pymysql

    一、链接、执行sql、关闭(游标)

    通过pyMySQL操作数据库通常分4步

    import pymysql
    
    # 1、建立连接
    con = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '123',database = 'd11')
    # 2、设置游标
    cursor = con.cursor(pymysql.cursors.DictCursor) # 设置游标的具体类型,DictCursor以字典的形式拿到字段名,默认以元组的形式
    # 3、执行sql语句
    sql = 'select * from emp;'
    res = cursor.execute(sql) # 执行sql语句,返回sql查询成功的记录行数
    # print(res)
    
    # 需求:具体的一条条记录
    # tag = cursor.fetchone() # 执行语句,返回获取的一条数据 第一条
    # print(tag)
    # tag = cursor.fetchone() # 执行语句,返回获取的一条数据 第二条
    # print(tag)
    # print(cursor.scroll(1, mode='relative')) # 指针相对于上一次位置往后偏移1条记录
    # cursor.scroll(res - 2, mode='absolute')# 指针绝对, 游标永远从头开始偏移
    
    tag = cursor.fetchall()  # 执行语句,获取所有数据
    print(tag)
    # 4、 关闭、断开连接
    cursor.close()
    con.close()
    
    # 使用执行的结果:
    # 		fetchone())当前游标往后获取一行记录
    # 		fetchall()当前游标往后所有的记录
    # 		scroll(num, mode="relative|absolute")
    # 				relative: 游标从当前位置往后移动num行
    # 				ablolute: 游标从头往后移动num行, 一般可以结合line来使用能定位到任意位置
    

    二、pymysql处理sql注入

    '''
    sql语法中
    注释: /**/  | --  | #
    
    什么是sql注入:
    通过书写sql包含(注释相关的)特殊字符, 让原有的sql执行顺序发生改变, 从而改变执行得到的sql
    
    目的:
    绕过原有的sql安全认证, 达到对数据库攻击的目的
    '''
    import pymysql
    conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='db2')
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    
    # 登录
    
    # 得到用户输入的账户密码
    usr = input("请输入用户名: ") #abc
    pwd = input("请输入密码: ") #123
    
    # sql注入
    # 1.知道用户名:  abc" -- hehe | ooo
    # select * from user where usr="abc" -- hehe" and pwd="ooo"
    # 2.不知道用户名 aaa" or 1=1 -- hehe | 000
    # select * from user where usr="aaa" or 1=1 -- hehe" and pwd="000"
    
    # 处理方式
    # 对输入的账户密码做完全处理 => 不可能形成达到sql注入的特殊语法 => 正则
    
    # 和数据库的账户密码进行配对
    # sql = 'select * from user where usr="%s" and pwd="%s"' % (usr, pwd)
    # select * from user where usr="abc" and pwd="123"
    # res = cursor.execute(sql)
    
    # pymysql已经处理了sql注入
    sql = 'select * from user where usr=%s and pwd=%s'
    res = cursor.execute(sql, (usr, pwd))
    
    # print(res)
    if res:
        print('login success')
    else:
        print('login failed')
    
    cursor.close()
    conn.close()
    

    三、增删改

    import pymysql
    conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='db2')
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    
    # 增
    # sql1 = 'insert into user(usr, pwd) values (%s, %s)'
    # cursor执行sql语句,在内存中完成了对数据的插入, 但不能将数据存放到硬盘
    # 会将id完成自增
    # 插入单条
    # res = cursor.execute(sql1, ("opq", "123"))
    # 插入多条
    #res = cursor.executemany(sql1, [("aaa", "000"), ("bbb", "111")])
    # print(res)
    # 将内存中的数据提交给硬盘, 完成真实意义上的数据存储
    # conn.commit()
    
    # 删
    # sql2 = 'delete from user where usr=%s'
    # res = cursor.execute(sql2, ("aaa"))
    # print(res)
    # conn.commit()
    
    # 改
    sql3 = 'update user set pwd=%s where usr=%s'
    res = cursor.execute(sql3, ("222", "bbb"))
    conn.commit()
    
    cursor.close()
    conn.close()
    
  • 相关阅读:
    【笔记】各种容器的特点
    超简单的java动态代理
    Mac idea 设置gitlab项目commit用户直见文尾有最优解
    burnside引理和polya定理
    最短路模板
    求phi及一些基本模板
    Unittest
    Pytest
    网络原因造成应用访问无响应
    CentOS7 下 离线安装 supervisor
  • 原文地址:https://www.cnblogs.com/prodigal/p/10258577.html
Copyright © 2020-2023  润新知