• Python操作数据库


    pymysql模块简单实用

    1、安装pymysql模块

    pip3 install PyMySQL

    2、建立连接

    与MySQL服务端建立连接

    conn=pymysql.connect(
      host = '127.0.0.1',  # ip
      port = 3306, #端口
      user = 'root',		 # 数据库用户名
      password = '123',  	 # 数据库密码
      database = 'egon',   # 数据库名字
      charset = 'utf8'  	 # 编码千万不要加- 如果写成了utf-8会直接报错
      autocommit = True  # 这个参数配置完成后  增删改操作都不需要在手动加conn.commit了
    )
    

    3、产生游标对象

    cursor = conn.cursor(pymysql.cursors.DictCursor)  
    # 产生一个游标对象  以字典的形式返回查询出来的数据 键是表的字段  值是表的字段对应的信息
    # cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
    

    4、执行sql语句

    #执行sql语句
    sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号
    res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
    print(res)
    
    # r1 = cursor.fetchone()  #返回一条,游标前进一次
    # r2 = cursor.fetchone()  #返回一条,游标再前进一次
    # r3 = cursor.fetchone()
    
    r = cursor.fetchall()  # 直接拉取所有结果
    print(r)
    
    cursor.close()
    conn.close()
    if res:
        print('登录成功')
    else:
        print('登录失败')
    

    用户登录案例

    import pymysql
    
    # 建立连接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='Quattro!',
        database='db1',
        charset='utf8',
        autocommit=True
    )
    
    # 创建游标
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    
    username = input('输入用户名:').strip()
    password = input('输入密码:').strip()
    
    sql = 'select * from user where username = %s and password = %s'
    
    res = cursor.execute(sql,(username, password)) #能够帮你自动过滤特殊符号 避免sql注入的问题
    if res:
        print(cursor.fetchall())
    else:
        print('登录失败')
    

    SQL注入

    利用注释等特殊符号,篡改sql语句,从而达到自己的目的

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

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

    sql注入一:知道用户名,绕过密码

    select * from user where name = 'zjy' - - asldkfjalsdjfad任意字符

    sql注入二:不知道用户名,绕过用户名和密码

    select * from user where name = 'zjy' or 1=1 - - alskdjflasjdflajsdlfk任意字符

    解决方案:

    # 原来是我们对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会自动为我们加上
    res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
    

    增删改:conn.commit()

    增:

    import pymysql
    conn = pymysql.connect(
    	host='localhost',
        port=3306,
        user='root',
        password='123',
        database='db1',
        charset='utf8',
        autocommit=True  #如果不加这个需要手动 conn.commit ,否则数据增删改不了。
    )
    # 插入方式一:
    # sql='insert into userinfo(name,password) values("root","123456");'
    # res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
    # print(res)
    
    # 插入方式二:
    # sql='insert into userinfo(name,password) values(%s,%s);'
    # res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
    # print(res)
    
    # 插入方式三:
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = 'insert into user(username, password) values(%s, %s)'
    res = cursor.executemany(sql, [('user1','pwd1'),('user2','pwd2')])
    # res是受影响的记录数量
    cursor.close()
    conn.close()
    

    查:fetchone, fetchall, fetchmany

    #执行sql语句
    sql='select * from userinfo;'
    rows=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
    
    # cursor.scroll(3,mode='absolute') # 相对绝对位置移动
    # cursor.scroll(3,mode='relative') # 相对当前位置移动
    res1=cursor.fetchone()  # 拉取一条数据
    res2=cursor.fetchone()
    res3=cursor.fetchone()
    res4=cursor.fetchmany(2)  # 拉取两条数据
    res5=cursor.fetchall()  # 拉取全部数据
     
    conn.commit() #提交后才发现表中插入记录成功,连接时如果写了 autocommit=True,就不需要这行
    

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

    print(cursor.lastrowid) #在插入语句后查看
    
  • 相关阅读:
    3.27 课堂 笔记
    第四周 4-2
    3-26
    Java EE期末项目
    条件查询、SQL、JPQL、HQL比较
    J2EE 第八周(04.23-04.29)
    J2EE 第七周(04.16-04.22)
    J2EE 第六周(04.09-04.15)
    J2EE 第五周(04.02-04.08)
    J2EE 第四周(03.26-04.01)
  • 原文地址:https://www.cnblogs.com/KbMan/p/11395668.html
Copyright © 2020-2023  润新知