zoukankan      html  css  js  c++  java
  • PyMySQL

    PyMySQL安装

    pip install pymysql
    

      

    连接数据库

    在进行本文以下内容之前需要注意:

    • 你有一个MySQL数据库,并且已经启动。
    • 你有可以连接该数据库的用户名和密码
    • 你有一个有权限操作的database

    基本使用

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    # 定义要执行的SQL语句
    sql = """
    CREATE TABLE USER1 (
    id INT auto_increment PRIMARY KEY ,
    name CHAR(10) NOT NULL UNIQUE,
    age TINYINT NOT NULL
    )ENGINE=innodb DEFAULT CHARSET=utf8;
    """
    # 执行SQL语句
    cursor.execute(sql)
    # 关闭光标对象
    cursor.close()
    # 关闭数据库连接
    conn.close()
    
    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句并且将结果作为字典返回的游标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # 定义要执行的SQL语句
    sql = """
    CREATE TABLE USER1 (
    id INT auto_increment PRIMARY KEY ,
    name CHAR(10) NOT NULL UNIQUE,
    age TINYINT NOT NULL
    )ENGINE=innodb DEFAULT CHARSET=utf8;
    """
    # 执行SQL语句
    cursor.execute(sql)
    # 关闭光标对象
    cursor.close()
    # 关闭数据库连接
    conn.close()
    返回字典格式数据:

    注意:

    charset=“utf8”,编码不要写成"utf-8"

      

    """
    获取用户输入,登录
    """
    import pymysql
    
    
    # 1. 获取用户输入
    name = input('请输入用户名:')
    pwd = input('请输入密码:')
    
    # 判断用户名和密码是否正确
    # 去数据库查询一下 用户输入的用户名和密码是否正确
    # 在Python程序中要连接数据库执行SQL语句  --> pymysql模块
    
    # 1. 连接数据库,得到一个连接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='day43',
        charset='utf8'
    )
    # 2. 获取光标
    cursor = conn.cursor()
    # 3. 执行SQL语句
    # 3.1 得到SQL语句
    sql = "select * from userinfo where username='%s' and password='%s';" % (name, pwd)
    print(sql)
    # 3.2 使用光标对象执行SQL语句
    ret = cursor.execute(sql)
    # 关闭
    cursor.close()
    conn.close()
    # 4 得到结果
    if ret:
        print('登陆成功')
    else:
        print('登录失败')
    pymysql登录示例

    SQL注入问题

    1. 什么是SQL注入?
        用户输入的内容有恶意的SQL语句,后端拿到用户输入的内容不做检测直接做字符串拼接,得到一个和预期不一致的SQL语句
    2. 如何解决SQL注入?
        对用户输入的内容做检测
        pymysql内置了这种检测,我们只需要让pymysql帮我们拼接sql语句
        ret = cursor.execute(sql, [name, pwd])  # 让pymysql模块帮我们拼接sql语句,执行SQL语句
    

      

    '''
    获取用户输入,登录
    '''
    
    import pymysql
    
    name = input('请输入用户名:')
    pwd = input('请输入密码:')
    
    
    # 1.连接数据库,得到一个连接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='day43',
        charset='utf8'
    )
    # 2.获取光标
    cursor = conn.cursor()
    # 3.执行sql语句
    # 3.1 得到sql语句
    sql = "select * from userinfo where  username=%s and password=%s;"  # 按照pymysql模块的写法定义好占位符
    print(sql)
    # 3.2使用光标对象执行sql语句
    # ret = cursor.execute(sql)
    ret = cursor.execute(sql, [name, pwd])  # 让pymsql模块帮我们拼接sql语句,执行sql语句
    # 关闭
    cursor.close()
    conn.close()
    # 4.得到结果
    print(ret)
    if ret:
        print('登录成功')
    else:
        print('登录失败')
    
    # with open('userinfo', ) as f:
    #     for line in f:
    #         u,p = line.strip().split()
    #         if u
    SQL注入

    """
    向userinfo表插入一条数据
    """
    import pymysql
    
    
    # 1. 连接数据库,得到一个连接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='day43',
        charset='utf8'
    )
    # 2. 获取光标
    cursor = conn.cursor()
    # 3. 执行SQL语句
    # 3.1 得到SQL语句
    sql = "insert into userinfo(username, password) values (%s,%s);"  # 按照pymysql模块的写法定义好占位符
    # 3.2 使用光标对象执行SQL语句
    ret = cursor.execute(sql, ['Eva_J', '456'])  # 让pymysql模块帮我们拼接sql语句,执行SQL语句
    # 涉及操作数据库的 一定要提交
    conn.commit()
    # 关闭
    cursor.close()
    conn.close()
    

      

    插入数据失败回滚

    在执行增删改操作时,如果不想提交前面的操作,可以使用 rollback() 回滚取消操作。

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
    username = "Alex"
    age = 18
    try:
        # 执行SQL语句
        cursor.execute(sql, [username, age])
        # 提交事务
        conn.commit()
    except Exception as e:
        # 有异常,回滚事务
        conn.rollback()
    cursor.close()
    conn.close()
    

      获取插入数据的ID(关联操作时会用到)

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
    username = "Alex"
    age = 18
    try:
        # 执行SQL语句
        cursor.execute(sql, [username, age])
        # 提交事务
        conn.commit()
        # 提交之后,获取刚插入的数据的ID
        last_id = cursor.lastrowid
    except Exception as e:
        # 有异常,回滚事务
        conn.rollback()
    cursor.close()
    conn.close()
    

      批量执行

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
    data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)]
    try:
        # 批量执行多条插入SQL语句
        cursor.executemany(sql, data)
        # 提交事务
        conn.commit()
    except Exception as e:
        # 有异常,回滚事务
        conn.rollback()
    cursor.close()
    conn.close()
    

      

    """
    从userinfo表把alex删掉
    """
    import pymysql
    
    
    # 1. 连接数据库,得到一个连接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='day43',
        charset='utf8'
    )
    # 2. 获取光标
    cursor = conn.cursor()
    # 3. 执行SQL语句
    # 3.1 得到SQL语句
    sql = "delete from userinfo where username=%s;"  # 按照pymysql模块的写法定义好占位符
    # 3.2 使用光标对象执行SQL语句
    ret = cursor.execute(sql, ['alex'])  # 让pymysql模块帮我们拼接sql语句,执行SQL语句
    # 涉及操作数据库的 一定要提交
    conn.commit()
    # 关闭
    cursor.close()
    conn.close()
    

      

    """
    从userinfo表把金老板的密码改成789
    """
    import pymysql
    
    
    # 1. 连接数据库,得到一个连接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='day43',
        charset='utf8'
    )
    # 2. 获取光标
    cursor = conn.cursor()
    # 3. 执行SQL语句
    # 3.1 得到SQL语句
    sql = "update userinfo set password=%s where username=%s;"  # 按照pymysql模块的写法定义好占位符
    # 3.2 使用光标对象执行SQL语句
    ret = cursor.execute(sql, ['789', 'gold'])  # 让pymysql模块帮我们拼接sql语句,执行SQL语句
    # 涉及操作数据库的 一定要提交
    conn.commit()
    # 关闭
    cursor.close()
    conn.close()
    

      

    """
    从userinfo表查询所有数据
    """
    import pymysql
    
    
    # 1. 连接数据库,得到一个连接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='day43',
        charset='utf8'
    )
    # 2. 获取光标
    cursor = conn.cursor()
    # 3. 执行SQL语句
    # 3.1 得到SQL语句
    sql = "select * from userinfo;"  # 按照pymysql模块的写法定义好占位符
    # 3.2 使用光标对象执行SQL语句
    cursor.execute(sql)  # 让pymysql模块帮我们拼接sql语句,执行SQL语句
    ret = cursor.fetchall()
    print(ret)
    # 关闭
    cursor.close()
    conn.close()
    

     

    查(字典类型)

    """
    从userinfo表查询所有数据
    """
    import pymysql
    
    
    # 1. 连接数据库,得到一个连接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='day43',
        charset='utf8'
    )
    # 2. 获取光标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # 3. 执行SQL语句
    # 3.1 得到SQL语句
    sql = "select * from userinfo;"  # 按照pymysql模块的写法定义好占位符
    # 3.2 使用光标对象执行SQL语句
    cursor.execute(sql)  # 让pymysql模块帮我们拼接sql语句,执行SQL语句
    # 查询所有
    # ret = cursor.fetchall()
    # 查询单条记录
    # ret = cursor.fetchone()
    # print(ret)
    # ret = cursor.fetchone()
    # print(ret)
    # ret = cursor.fetchone()
    # print(ret)
    # 查询指定数量的数据
    ret = cursor.fetchmany(3)
    print(ret)
    print(cursor.fetchone())
    print(cursor.fetchone())
    # cursor.scroll(0, mode='absolute')  # 绝对位置,你让光标移动到哪里
    # cursor.scroll(-1, mode='relative')  # 相对位置,基于光标当前位置移动
    print(cursor.fetchone())
    # 关闭
    cursor.close()
    conn.close()
    

      

    进阶用法

    # 可以获取指定数量的数据
    cursor.fetchmany(3)
    # 光标按绝对位置移动1
    cursor.scroll(1, mode="absolute")
    # 光标按照相对位置(当前位置)移动1
    cursor.scroll(1, mode="relative")
    

      

     

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/eaoo/p/9757303.html
Copyright © 2011-2022 走看看