zoukankan      html  css  js  c++  java
  • python中pymsql常用方法(1)

    python中pymysql模块常用方法以及其使用

    首先我们知道pymysql 是python中操作数据库的模块

    使用步骤分为如下几步:

    ​ 1.与数据库服务器建立链接 conn=pymysql.Connect(....)

    ​ 2.获取游标对象(用于发送和接受数据)cursor=conn.cursor()

    ​ 3.使用游标执行sql语句cursor.excute(sql)-->此时返回的是执行该语句后数据库表中受影响的数据条数

    ​ 4.使用fetch方法来获取执行的结果

    ​ 5.关闭连接:先关闭游标,再关闭连接

    id caption
    1 三年级二班
    2 三年级三班
    3 一年级二班
    4 二年级九班

    简单使用之数据库读取

    import pymysql
    
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='root',
        database='day41',
        charset='utf8'
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)  # 将查询结果做成字典格式
    res = cursor.execute('select * from class')  # 返回的值是受影响数据的条数
    print(res)  # 查询到的数据总条数
    print(cursor.fetchone())  # 获取一条查询结果
    
    # cursor.scroll(1, 'absolute')  # 绝对移动:相对于文件起始位置,向后移动一组数据
    # cursor.scroll(1,'relative')  # 相对移动,相对于当前位置,向后移动一个位置
    cursor.scroll(-1) # 游标 相对移动到当前位置的前一条数据位置
    # 获取所有剩余的内容查询的内容的字典 --》类似于文件读写的游标
    print(cursor.fetchall())  # [{'cid': 2, 'caption': '三年三班'}, {'cid': 3, 'caption': '一年二班'}, {'cid': 4, 'caption': '二年九班'}]
    cursor.close()  # 关闭游标
    conn.close()  # 关闭连接
    

    简单使用之数据库的增改删操作

    ​ 上面所示的是我们在python中pymysql的最简单的用法,在实际中,我们在对数据库的读取操作的时候,是不需要进行commit提交处理的,但是在对表的增和改操作的时候,数据库默认是启用事务的,sql语句如果没有提交相当于没有执行。

    id name password money
    1 qzk 123 1000
    2 qby 123 1000
    3 qwe 123 1000
    4 zdc 123 1000
    5 qqq 123 1000
    # -*- coding: utf-8 -*-
    import pymysql
    
    # Connect 类 实例化一个 conn连接对象
    conn = pymysql.Connect(
        host='127.0.0.1',
        user='root',
        port=3306,
        password='root',
        database='day41',
        charset='utf8'
    )
    # 获取游标对象
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    # 这里演示一下 rollback()作用:当有两个或多个操作因其他原因只完成部分操作而未能执行完全部操作导致的数据不安全问题,可以对表数据中的增改进行撤销处理。
    try:
        res1 = cursor.execute("update userinfo set money = money-50 where name= 'qqq'")
        print(cursor.fetchall())
        res = cursor.execute("update userinfo set money =money-50 where name= 'ewr'")
        if not res:  # 该处演示当 res 返回值为0时,表示该操作未对数据库产生影响,因为ewr不在数据库中,所以返回0,此事上一句操作 res1 已操作完毕,用户账户余额已减去50 ,故,需要撤销上面的操作,所以用 rollback()
            print('转账失败')
            conn.rollback()
    except:
        conn.rollback()
    cursor.execute("select * from userinfo")  # 执行语句查看数据库的userinfo所有字段信息,返回收影响的数据条数
    print(cursor.fetchall())  # 查看到上面语句执行的结果
    # 提交修改 因为pymysql模式默认是启用事务的,sql语句如果没提交相当于没执行
    conn.commit()  # 提交事务
    
    """
    注意:pymysql 默认不提交修改的,但是这里指的是对表中的记录操作不提交,像诸如删库、删表的操作时无法撤销的
    """
    
    

    链接数据库的用户登录简单实现

    # -*- coding: utf-8 -*-
    import pymysql
    
    # 创建连接得到一个连接对象
    conn = pymysql.Connect(
        host='127.0.0.1',  # 数据库服务器主机地址
        port=3306,  # 端口号,可选
        user='root',  # 数据库用户名
        password='root',  # 数据库密码
        database='day41',  # 数据库名称
        charset='utf8'  # 编码
    )
    
    while True:
        name_inp = input('>>>username:').strip()
        pwd_inp = input('>>>>pwd:').strip()
        # 获取游标对象
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        sql = 'select * from userinfo where name=%s and password=%s'
        # cursor 执行sql
        res = cursor.execute(sql, (name_inp, pwd_inp))
        print(res)
        # sql注入
        if res:
            print('登录成功')
            print(cursor.fetchone())  # 查询一个
            break
        else:
            print('登录失败,用户名或密码错误')
        # 关闭游标
        cursor.close()
        # 关闭连接
    conn.close()
    """
    一般我们不要自己手动拼接(关键参数)查询条件(会导致sql注入)
    """
    

    sql注入问题

    # 不要手动去拼接查询的sql语句
    username = input(">>>:").strip()
    password = input(">>>:").strip()
    sql = "select * from user where username='%s' and password='%s'"%(username,password)
    
    # 用户名正确
    username >>>: jason' -- jjsakfjjdkjjkjs
    # 用户名密码都不对的情况
    username >>>: xxx' or 1=1 --asdjkdklqwjdjkjasdljad
    password >>>: ''
    

    增删改

    # 增
    sql = "insert into user(username,password) values(%s,%s)"
    rows = cursor.excute(sql,('jason','123'))
    
    # 修改
    sql = "update user set username='qzksdb' where id=1"
    rows = cursor.excute(sql)
    
    """
    增和改单单执行excute并不会真正影响到数据,需要再执行conn.commit()才可以完成真正的增改
    """
    
    # 一次插入多行记录
    res = cursor,excutemany(sql,[(),(),()]
    
  • 相关阅读:
    470. 用 Rand7() 实现 Rand10() 采样
    165. 比较版本号 字符串
    Java 通过属性名称读取或者设置实体的属性值
    双非Java的学习之旅以及秋招路程
    【Unity3D】不可读Texture资源的获取
    java 8 Map 之merge用法
    Jmeter-计数器的应用
    Jmeter-集合点【同步定时器】应用
    2. Go并发编程--GMP调度
    Go序列化嵌套结构体
  • 原文地址:https://www.cnblogs.com/qianzhengkai/p/10876682.html
Copyright © 2011-2022 走看看