zoukankan      html  css  js  c++  java
  • python学习笔记 day45 pymysql

    1. 使用pymysql模块实现python与数据库的交互

    需求: python实现用户登录,用户输入用户名和密码,然后用户信息都保存在userinfo数据库中,可以借助pymysql模块实现python和数据库的交互,来模拟用户登录~

    首先我们先创建一个userinfo表:

     

     在python中借助pymysql模块(不推荐!!

    import pymysql
    
    usm=input("username:")
    pwd=input("password:")
    conn=pymysql.connect(host="localhost",user="root",password="******(你登录mysql的密码)",database="db666")  # connect()中的参数 host是哪一台主机上安装了mysql 接着是mysql登录的用户名和密码 以及所要操作连接的数据库
    cursor=conn.cursor()  # 可以拿着cursor去操作执行数据库中的语句
    sql="select * from userinfo where username='%s' and password='%s'"%(usm,pwd)
    cursor.execute(sql)  # 使用cursor.execute(sql)去执行sql语句----select * from userinfo where username=  and password=
    result=cursor.fetchone() # 获得查询一条查询结果,如果查到相应的数据,就会返回查到的结果给result(fetchone()只可以查到一条记录)
    cursor.close()  # 关闭数据库
    conn.close()
    print(result) # 会打印查询的结果

    运行结果:

    上面在写sql语句时采用了字符串拼接的形式,一定要注意!!千万不能这样写,因为:

     就是因为上面sql语句使用了字符串拼接的操作,专业术语叫做sql注入;

    其实你会发现当输入的用户名为xuanxuna‘ -- 时  sql语句就相当于执行了 ’select * from userinfo where username="xuanxuan' --' and password='%s' "   显然 password那部分使用--直接就注释掉了!!

     所以sql注入会有安全隐患!!

     正确做法应该是,当所要执行的sql语句需要传入参数时,我们应该在cursor.execute()中传入相应的参数 来防止sql注入,pymysql会自动帮我们去执行相应的填充操作!!

    import pymysql
    usm=input("username:")
    pwd=input("password:")
    conn=pymysql.connect(host="localhost",user="root",password="*******",database="db666") # 数据库的连接
    cursor=conn.cursor()
    sql="select * from userinfo where username=%s and password=%s"   # 需要执行的sql语句,但是不能使用字符串的拼接(sql注入很不安全(注意%s不加引号!!!)
    cursor.execute(sql,[usm,pwd])  # 将所要执行的sql语句中的参数 传到cursor.execute()中来pymysql会自动填充执行(注意后面的需要填充的参数用列表或者元素的形式)
    # sql="select * from userinfo where username=%(u)s and password=%(p)s"  # 下面cursor.execute(sql,{"u":usm,"p":pwd}) 就得写成字典形式
    # cursor.execute(sql,{"u":usm,"p":pwd})
    result=cursor.fetchone()  # select 数据库查询结果需要使用fetchone()来获得;
    
    cursor.close()   # 关闭数据库
    conn.close()
    
    # print(result) #  查看操作数据库(select查询结果,如果用户输入的用户名和密码在userinfo表中可以查找到,就证明该用户是合法用户,可以登录成功)
    if result:
        print("恭喜您,登陆成功")
    else:
        print("抱歉,登录失败!")

    运行结果:

     2. 使用pymysql模块实现python操作数据库---增删改查

    2.1 增

    import pymysql
    
    conn=pymysql.connect(host="localhost",user="root",password="******",database="db666")
    cursor=conn.cursor()
    sql="insert into userinfo(username,password) values('xixi','123')"  # 往infor表中增加一条记录
    cursor.execute(sql)  # 使用cursor.execute()执行sql语句
    conn.commit()  # 将增加insert 数据项的操作提交!! 但是对数据库查询操作不需要提交
    # cursor.fetchone() # 查询操作需要获得查询结果的返回值(对数据库增删改时不需要cursor.fetchone()获得一条记录,只需要提交操作即可)
    cursor.close() # 关闭数据库
    conn.close()

     运行结果:

    增加数据的操作(带有变量的,跟之前查询带有变量一样,将需要传入的参数放在cursor.execute(sql,[args])中去)不要sql注入;

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="*******",database="db666")
    cursor=conn.cursor()
    sql="insert into userinfo(username,password)values(%s,%s)" # 注意当使用cursor.execute(sql,(arg1,arg2))往sql中传入参数时,一定要注意%s不要加引号!!!
    cursor.execute(sql,["dongdong","123"])  # cursor.execute()传入参数可以写成[] 或者()形式
    conn.commit()
    cursor.close()
    conn.close()

    运行结果:

    当需要增加多条数据时:

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="******",database="db666")
    cursor=conn.cursor()
    sql="insert into userinfo(username,password) values(%s,%s)"  # 当使用cursor.execute(sql,[arg1,arg2])传入参数时 sql语句中响应变量的占位符不要加引号!!
    cursor.executemany(sql,[['haha','123'],['nene','123'],['bobo','123']])  # 插入多条数据 要使用cursor.executemany(sql,[(),(),()]) 不是execute() 而是executemany()!!!
    conn.commit() # 当对数据库执行增删改操作时,一定要注意提交conn.commit()
    cursor.close()
    conn.close()

    运行结果:

    2.2 删 改操作(同增)都需要在cursor.execute(sql)之后进行提交conn.commit()

     3. 查--fetchone()  差一条数据,fetchmany(n) 查多条数据 fetchall()查所有数据;

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="******",database="db666")
    cursor=conn.cursor()
    sql="select * from userinfo"
    cursor.execute(sql)
    result=cursor.fetchone()  # fetchone()获得一条数据,查操作需要cursor.fetch() 但是不需要conn.commit() 增删改刚好反过来
    print(result)
    result=cursor.fetchone()  # 又拿到一条数据(会有一个指针移动的,拿到下一条数据)
    print(result)
    cursor.close()
    conn.close()

    运行结果:

     其实可以看到的cursor.fetchone()返回的结果是一个元祖类型的,但是看起来很不方便,所以我们可以使用cursor=conn.cursor(cursor=pymysql.cursors,DictCursor)修改conn.cursor()的参数,使得cursor.fetchone()返回的结果是一个字典(字段:字段对应的值)

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="******",database="db666")
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)  # 修改conn.cursor(cursor=)的参数,使得cursor.fetchone()返回的结果不再是元组 而是直观的字典形式
    sql="select * from userinfo"
    cursor.execute(sql)
    result=cursor.fetchone()  # fetchone()获得一条数据,查操作需要cursor.fetch() 但是不需要conn.commit() 增删改刚好反过来
    print(result)
    result=cursor.fetchone()  # 又拿到一条数据(会有一个指针移动的,拿到下一条数据)
    print(result)
    cursor.close()
    conn.close()

     运行结果:

     如果是获得多条数据时:可以使用cursor.fetchmany(n) 获得所有数据可以使用cursor.fetchall()

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="******",database="db666")
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)  # 修改conn.cursor(cursor=)的参数,使得cursor.fetchone()返回的结果不再是元组 而是直观的字典形式
    sql="select * from userinfo"
    cursor.execute(sql)
    result=cursor.fetchmany(4)  # fetchmany(4)获得查询结果的四条
    print(result)
    cursor.close()
    conn.close()

    运行结果:

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="***********",database="db666")
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)  # 修改conn.cursor(cursor=)的参数,使得cursor.fetchone()返回的结果不再是元组 而是直观的字典形式
    sql="select * from userinfo"
    cursor.execute(sql)
    result=cursor.fetchall()  # fetchall()获得所有的查询结果
    print(result)
    cursor.close()
    conn.close()

     

     4. 获得新插入数据的自增ID(cursor.lastrowid) 

    就是当一张表插入数据的字段比如userinfo表 只插入username,password 但是可能有时候需要获得新插入数据的uid(主键自增的id) 就需要使用cursor.lastrowid获得

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="123",database="db666")
    cursor=conn.cursor() # cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)显示结果是字典形式 一般select查询时才会用到
    sql="insert into userinfo(username,password) values(%s,%s)"
    cursor.execute(sql,["nono","124"])
    conn.commit()  # 对数据库执行增删改时需要提交
    print(cursor.lastrowid)  # 获得最新插入数据的自增ID
    cursor.close()
    conn.close()

    运行结果:

    talk is cheap,show me the code
  • 相关阅读:
    @FeignClient同一个name使用多个配置类报错,解决方案【转+改进】
    spring cloud 与spring boot 版本不匹配引发的问题总结
    无聊系列
    基于redis+lua实现的分布式限流
    elasticsearch 优化笔记
    redis+lua库存扣减和冲正
    es-dsl笔记
    wiki—-Confluence搭建
    Linux常用命令
    SQLSERVER|CDC 日志变更捕获机制
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9966040.html
Copyright © 2011-2022 走看看