zoukankan      html  css  js  c++  java
  • 8.6.1 python3的mysql模块pymysql

    之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢?这就用到了pymysql模块,该模块本质就是一个套接字客户端软件,使用前需要事先安装

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

    import pymysql
    
    login_user=input("user>> ").strip()
    login_pwd = input("passwor>> ").strip()
    # 建立连接
    conn = pymysql.connect(
        host="127.0.0.1",
        port=3306,
        user="cmz",
        passwd="cmz",
        db="leco",
        charset="utf8"
    )
    
    # 拿到游标
    cursor = conn.cursor()
    
    sql = 'select * from userinfo where user ="%s" and pwd="%s"' %(login_user, login_pwd)
    
    row = cursor.execute(sql)
    cursor.close()
    conn.close()
    
    # 判断
    
    if row:
        print("登录成功")
    else:
        print("登录失败")
    C:Python35python.exe D:/MySQL/mysql基本使用.py
    user>> cmz
    passwor>> 123
    登录成功
    View Code

    三 execute()之sql注入

    注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符

    根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

    最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='cmz';则--之后的条件被注释掉了
    
    #1、sql注入之:用户存在,绕过密码
    cmz' -- 任意字符  # --在MySQL中表示注释
    
    #2、sql注入之:用户不存在,绕过用户与密码
    xxx' or 1=1 -- 任意字符
    user>> xxx" or 1=1 -- jaa
    passwor>> 
    select * from userinfo where user ="xxx" or 1=1 -- jaa" and pwd=""
    登录成功

    解决方法:

    # 原来是我们对sql进行字符串拼接
    # sql="select * from userinfo where name='%s' and password='%s'" %(login_user,login_pwd)
    # print(sql)
    # res=cursor.execute(sql)
    
    #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
    sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
    res=cursor.execute(sql,[login_user,login_pwd])    #[login_user,login_pwd] 和 (login_user,login_pwd) 都有可以

    #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

    四 增、删、改:conn.commit()

    增删改
    import pymysql
    
    # 建立连接
    conn = pymysql.connect(
        host="127.0.0.1",
        port=3306,
        user="cmz",
        passwd="cmz",
        db="leco",
        charset="utf8"
    )
    
    # 拿到游标
    cursor = conn.cursor()
    
    # 增删改
    sql = 'insert into userinfo(user,pwd) values(%s, %s)'
    # row = cursor.execute(sql,("xxx",'123'))
    row = cursor.executemany(sql,[('yxx','123'),('cmz1','111'),('cmz2','2222')])  # #执行sql语句,返回sql影响成功的行数
    print(row)
    conn.commit() #提交后才发现表中插入记录成功 cursor.close() conn.close()

     

    五 查:fetchone,fetchmany,fetchall

    # 查询
    import pymysql
    
    # 建立连接
    conn = pymysql.connect(
        host="127.0.0.1",
        port=3306,
        user="cmz",
        passwd="cmz",
        db="leco",
        charset="utf8"
    )
    
    # 拿到游标
    # cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    
    # 查询
    row = cursor.execute('select * from userinfo;')  #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
    print(row)
    # print(cursor.fetchall()) # 一次取全部
    # print(cursor.fetchmany(2)) # 一次取N(2)条
    # print(cursor.fetchone()) # 一次取一条
    # print(cursor.fetchone()) # 一次取一条
    # print(cursor.fetchone()) # 一次取一条
    
    #
    # cursor.scroll(3,mode='absolute') # 相对绝对位置移动
    # cursor.scroll(3,mode='relative') # 相对当前位置移动
    
    # cursor.scroll(3,mode='absolute') # 相对绝对位置移动
    print(cursor.fetchone())
    print(cursor.fetchone())
    cursor.scroll(2,mode='relative') # 向后移动两条数据
    print(cursor.fetchone())
    
    conn.commit()
    cursor.close()
    conn.close()

     结果:

    12
    {'user': 'cmz', 'id': 1, 'pwd': '123'}
    {'user': 'leco', 'id': 2, 'pwd': '456'}
    {'user': 'cmz1', 'id': 5, 'pwd': '111'}
    18

    五 获取插入的最后一条数据的自增ID

    在插入之前查看数据库

    id在15

    import pymysql
    
    # 建立连接
    conn = pymysql.connect(
        host="127.0.0.1",
        port=3306,
        user="cmz",
        passwd="cmz",
        db="leco",
        charset="utf8"
    )
    
    # 拿到游标
    cursor = conn.cursor()
    
    # 插入
    sql = 'insert into userinfo(user,pwd) values(%s, %s)'
    # row = cursor.execute(sql,("xxx",'123'))
    row = cursor.executemany(sql,[('cc1','123'),('cc2','111'),('cc3','2222')]) # 一次性插入多条
    print(cursor.lastrowid)  #获取插入的最后一条数据的自增ID
    
    
    conn.commit()
    cursor.close()
    conn.close()

    结果是

    C:Python35python.exe D:MySQL/mysql模块之增删改查.py
    21

    此时查看数据库自增的ID

  • 相关阅读:
    德信创业系2014版
    [学习笔记]矩形面积并
    第六章 深入分析ClassLoader工作机制
    第五章 深入class文件结构
    设计模式
    第四章 Javac编译原理
    第三章 深入分析Java Web中的中文编码问题
    第2章 深入分析java I/O的工作机制(下)
    linnx常用命令学习
    jenkins学习(1)
  • 原文地址:https://www.cnblogs.com/caimengzhi/p/8586078.html
Copyright © 2011-2022 走看看