zoukankan      html  css  js  c++  java
  • pymysql模块

    一、模块安装

    #安装
    pip3 install pymysql

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

    import pymysql
    user=input('用户名: ').strip()
    pwd=input('密码: ').strip()
    
    #链接
    conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8) #指定字符编码,可显示中文
    #游标
    cursor=conn.cursor()
    
    #执行sql语句
    sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号
    print(sql)
    res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
    print(res)
    
    cursor.close()
    conn.close()
    
    if res:
        print('登录成功')
    else:
        print('登录失败')

    三、execute()之sql注入

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

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

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

     

    解决方法:

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

    单条数据执行sql语句
    cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
    多条数据执行sql语句
    cursor.executemany(sql,[('yuanhao','123'),('laowu','123'),('kgf','12323')])
     

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

    import pymysql
    #链接
    conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
    #游标
    cursor=conn.cursor()
    
    #执行sql语句
    #part1
    # sql='insert into userinfo(name,password) values("root","123456");'
    # res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
    # print(res)
    
    #part2
    # sql='insert into userinfo(name,password) values(%s,%s);'
    # res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
    # print(res)
    
    #part3
    sql='insert into userinfo(name,password) values(%s,%s);'
    res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #执行sql语句,返回sql影响成功的行数
    print(res)
    
    conn.commit() #提交后才发现表中插入记录成功
    cursor.close()
    conn.close()

    五、查:fetchone,fetchmany,fetchall

    import pymysql
    #链接
    conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')
    #游标
    cursor=conn.cursor()
    # cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) 设置查询的结果为字典格式
     
    #执行sql语句
    sql='select * from userinfo;'
    rows=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
    
    #光标移动 # cursor.scroll(3,mode='absolute') # 相对绝对位置移动,参照数据开头位置,找到索引为3的数据,即第四条 # cursor.scroll(3,mode='relative') # 相对当前位置往后移动3个,负数则往前移

    #查单条

    res1=cursor.fetchone() # 拿到的结果是元组形式  (1,‘root’,'123456') 执行后,光标移动 res2=cursor.fetchone() # 此时拿到的结果是第二条数据  (2,‘root’,'123456') res3=cursor.fetchone() # 此时拿到的结果是第三条数据  (3,‘root’,'123456')

    #查多条 res4
    =cursor.fetchmany(2) # 同时取2条数据((4,‘root’,'123456'),(5,‘root’,'123456')

    #查所有 res5
    =cursor.fetchall() print(res1) print(res2) print(res3) print(res4) print(res5) print('%s rows in set (0.00 sec)' %rows) conn.commit() #提交后才发现表中插入记录成功 cursor.close() conn.close() ''' (1, 'root', '123456') (2, 'root', '123456') (3, 'root', '123456') ((4, 'root', '123456'), (5, 'root', '123456')) ((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156')) 8 rows in set (0.00 sec) '''

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

    import pymysql
    conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8)
    cursor=conn.cursor()
    
    sql='insert into userinfo(name,password) values("xxx","123");'
    rows=cursor.execute(sql)
    
    conn.commit()
    print(cursor.lastrowid) #在commit之前和之后都可以查看
    cursor.close()
    conn.close()

    七、自定义sqlhelper!

    import pymysql
    
    class SQLHelper(object):
    
        def __init__(self):
            self.conn = None
            self.cursor = None
    
        def open(self,cursor=pymysql.cursors.DictCursor):
            self.conn = db_pool.POOL.connection()
            self.cursor = self.conn.cursor(cursor=cursor)
    
        def close(self):
            self.cursor.close()
            self.conn.close()
    
        def fetchone(self,sql,params):
            cursor = self.cursor
            cursor.execute(sql,params)
            result = cursor.fetchone()
    
            return result
    
        def fetchall(self, sql, params):
            cursor = self.cursor
            cursor.execute(sql, params)
            result = cursor.fetchall()
            return result
    
        def create(self, sql, params):
            cursor = self.cursor
            cursor.execute(sql, params)
            self.conn.commit()
            return self.cursor.lastrowid
    
        def delete(self, sql, params):
            cursor = self.cursor
            cursor.execute(sql, params)
            self.conn.commit()
    
        def update(self, sql, params):
            cursor = self.cursor
            cursor.execute(sql, params)
            self.conn.commit()
    
        def __enter__(self):
            self.open()
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            self.close()
            with SQLHelper() as helper:
                result1 = helper.fetchone('select * from users where name=%s and pwd = %s',['hc',123,])   # 查单条记录
        
                result2 = helper.fetchall('select * from users ',[])  #查所有记录
            
                helper.create('insert into user (name,pwd) value(%s,%s)',['hc',123])    # 创建记录

    定义函数时,设置参数默认值是注意, 默认参数不要传成可变数据类型

    使用时

  • 相关阅读:
    微博(MicroBlog)
    面试题网站目录
    html 打印代码,支持翻页
    C#日期格式化
    职位英语简称注解
    专业术语:闭包、网站优化 Gzip 服务器端文件压缩
    1,由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。
    JSON-JSON 百科
    api.js
    Android消息处理机制
  • 原文地址:https://www.cnblogs.com/huchong/p/7521799.html
Copyright © 2011-2022 走看看