zoukankan      html  css  js  c++  java
  • Pymysql

    PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

    注意事项

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

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

    基本使用

    import pymysql
    # 创建连接(连接数据库ip,库名,用户名,密码,编码)
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    # 创建浮标
    cursor = conn.cursor()
    sql = "select * from course;"
    # 执行sql语句
    ret = cursor.execute(sql)
    # 关闭浮标
    cursor.close()
    # 关闭连接
    conn.close()
    # 执行sql语句返回的是受影响的条数,查询时就是查到的条数
    print(ret)

    带有参数的sql语句与sql注入

    简单的使用字符串拼接会有一些漏洞,比如我们的数据库中只有一个姓名为"年轻人",密码为"123"的账号

    import pymysql
    name = input("请输入用户名")
    pwd = input("请输入密码")
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "select * from info where name='%s' and pwd='%s';"%(name,pwd)
    print(sql)
    ret = cursor.execute(sql)
    cursor.close()
    conn.close()
    if ret:
        print("登录成功")
    else:
        print("登录失败")

    比如我们输入姓名时输入"年轻人' -- "(注意--两边有空格),这是-- 后面的内容被注释,不需要密码便能够登录

    更甚至我们在"--"前用"or"连接一个成立条件,即使用户名不存在也能够登录

    比如我们输入"bucunzai' or 1=1 -- "

    pymysql帮我们解决了这些问题,我们不必自己拼接sql语句

    import pymysql
    name = input("请输入用户名")
    pwd = input("请输入密码")
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    print(sql)
    # 我们只需要向执行sql语句的方法中传递元组类型的参数
    ret = cursor.execute( "select * from info where name=%s and pwd=%s;",(name,pwd))
    # 或者绑定关键字,传一个字典
    # ret = cursor.execute( "select * from info where name=%(name)s and pwd=%(pwd)s;",{name=name,pwd=pwd})
    cursor.close()
    conn.close()
    if ret:
        print("登录成功")
    else:
        print("登录失败")

    增删改查操作

    import pymysql
    name = input("请输入用户名")
    pwd = input("请输入密码")
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "insert into info(name,pwd) values (%s,%s)"
    ret = cursor.execute(sql,(name,pwd))
    conn.commit()#修改数据库需要提交才能够完成修改,否则只是在内存中修改
    cursor.close()
    conn.close()

    有提交便有回滚rollback(),可以利用python中的异常机制来回滚操作

    import pymysql
    name = input("请输入用户名")
    pwd = input("请输入密码")
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "insert into info(name,pwd) values (%s,%s)"
    try:
        cursor.execute(sql,(name,pwd))
        conn.commit()  #修改数据库需要提交才能够完成修改,否则只是在内存中修改
    except Exception as e:
        conn.rollback()  # 执行两条sql语句需要同时成功,如果有一条发生了错误,就会回滚到操作之前的数据
    cursor.close()
    conn.close()

    获取插入数据的ID

    import pymysql
    name = input("请输入用户名")
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "insert into teacher(t_name) values (%s)"
    try:
        cursor.execute(sql,(name,))
        conn.commit()
        id = cursor.lastrowid  # 获取插入行的主键id,主键要设置自增长
        print(id)
    except Exception as e:
        conn.rollback()
    cursor.close()
    conn.close()

    批量操作

    import pymysql
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "insert into teacher(t_name) values (%s)"
    name=(("童安",),("童猛",))
    try:
        cursor.executemany(sql,name)  # 批量操作,executemany()方法,传递sql语句与(参数集合)的集合或列表
        conn.commit()
    except Exception as e:
        print("错误了")
        conn.rollback()
    cursor.close()
    conn.close()

    import pymysql
    num=input("请输入序号")
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "delete from teacher where t_id=%s" # 执行删除的sql语句
    try:
        cursor.execute(sql,(num,))  
        conn.commit()
    except Exception as e:
        print("错误了")
        conn.rollback()
    cursor.close()
    conn.close()

    增删改都是差不多的

    import pymysql
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    cursor = conn.cursor()
    # 修改数据的SQL语句
    sql = "UPDATE USER1 SET age=%s WHERE name=%s;"
    username = "Alex"
    age = 80
    try:
        cursor.execute(sql, [age, username])
        conn.commit()
    except Exception as e:
        conn.rollback()
    cursor.close()
    conn.close()

    sql语句的执行函数返回的是受影响的行,该怎样拿到查询结果呢

    查询单条数据

    import pymysql
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "select * from teacher"
    cursor.execute(sql)
    ret = cursor.fetchone()  # 拿到一条元组类型的查询结果
    cursor.close()
    conn.close()
    print(ret) # (2, '老子')

    查询指定数量的数据(超出范围返回全部)

    import pymysql
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "select * from teacher"
    cursor.execute(sql)
    ret = cursor.fetchmany(3) # 元组中嵌套元组
    cursor.close()
    conn.close()
    print(ret) # ((2, '老子'), (3, '墨子'), (4, '谢逊'))

    查询全部数据

    import pymysql
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "select * from teacher"
    cursor.execute(sql)
    ret = cursor.fetchall() # 元组中嵌套元组
    cursor.close()
    conn.close()

    另外还可以使查到的数据成为键值对形式,需要在创建光标时提供cursor=pymysql.cursors.DictCursor参数

    import pymysql
    conn = pymysql.connect(host="localhost", database="test", user="root", password="123456", charset="utf8")
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = "select id,cname from class order by id"
    cursor.execute(sql)
    ret = cursor.fetchall()  # 拿到全部查询结果
    cursor.close()
    conn.close()
    print(ret)
    # [{'id': 8, 'cname': '全栈8期'}, {'id': 9, 'cname': '全栈7期'}, {'id': 10, 'cname': '全栈12期'}, {'id': 11, 'cname': '全栈9期'}]
    # 获取多条数据是列表中嵌套着字典,字典中是字段名与值的键值对
    
    conn = pymysql.connect(host="localhost", database="test", user="root", password="123456", charset="utf8")
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = "select id,cname from class order by id"
    cursor.execute(sql)
    ret = cursor.fetchone()  # 拿到全部查询结果
    cursor.close()
    conn.close()
    print(ret)
    # {'id': 8, 'cname': '全栈8期'}  获取单条数据是一个字典

    移动光标

    查询到哪里光标便移动到哪里,再次查询就从那里开始.查询超出范围查询单个返回None,查询多个返回().

    # 光标按绝对位置移动n 按绝对位置移动参数不可以为负
    cursor.scroll(1, mode="absolute")
    # 光标按照相对位置(当前位置)移动n 默认 ,不可以移动到开始之前
    cursor.scroll(1)
    cursor.scroll(1, mode="relative")

    相对移动

    import pymysql
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "select t_id from teacher"
    cursor.execute(sql)
    ret = cursor.fetchmany(2) # 元组中嵌套元组,id从2开始的
    cursor.scroll(-1) # 向前移动1
    ret1 = cursor.fetchmany(2)
    cursor.close()
    conn.close()
    print(ret) # ((2,), (3,))
    print(ret1) # ((3,), (4,))

    绝对移动

    import pymysql
    conn = pymysql.connect(host="localhost",database="test",user="root",password="123456",charset="utf8")
    cursor = conn.cursor()
    sql = "select t_id from teacher"
    cursor.execute(sql)
    ret = cursor.fetchmany(2) # 元组中嵌套元组,id从2开始的
    cursor.scroll(1, mode="absolute") #移动到1
    ret1 = cursor.fetchmany(2)
    cursor.close()
    conn.close()
    print(ret) # ((2,), (3,))
    print(ret1) # ((3,), (4,))
    

    通过面向对象封装

    import pymysql
    # 数据库配置信息
    DB_CONFIG = {
        "host": "localhost",
        "user": "root",
        "password": "root1234",
        "database": "s8",
        "charset": "utf8"
    }
    class SQLHelper(object):
    
        @staticmethod
        def open(cursor):
            # 创建连接,cursor决定是返回字典还是元组
            conn = pymysql.connect(**DB_CONFIG)
            cursor = conn.cursor(cursor=cursor)
            return conn,cursor
    
        @staticmethod
        def close(conn,cursor):
            # 关闭连接
            conn.commit()
            cursor.close()
            conn.close()
    
        @classmethod
        def fetch_one(cls,sql,args,cursor =pymysql.cursors.DictCursor):
            # 查询一条
            conn,cursor = cls.open(cursor)
            cursor.execute(sql, args)
            obj = cursor.fetchone()
            cls.close(conn,cursor)
            return obj
    
        @classmethod
        def fetch_all(cls,sql, args,cursor =pymysql.cursors.DictCursor):
            # 查询多条
            conn, cursor = cls.open(cursor)
            cursor.execute(sql, args)
            obj = cursor.fetchall()
            cls.close(conn, cursor)
            return obj
    
        @classmethod
        def update(cls,sql, arg=None):
            # 增删改,其实增还可以单独列出来,因为可以去获取他的主键ID
            conn, cursor = cls.open(cursor=None)
            try:
                cursor.execute(sql, arg)
                conn.commit()
            except Exception as e:
                conn.rollback()
                raise
            finally:
                cls.close(conn, cursor)
    

      

  • 相关阅读:
    C/C++中浮点数输出格式问题
    C/C++中的输出对齐设置
    C++11 中的initialize_list
    c++中的构造函数初始化列表
    C++11中的array
    STL 中的链表排序
    poj1068 Parencodings
    poj 3295 Tautology
    How To Join XLA_AE_HEADERS and RCV_TRANSACTIONS(子分类账到事务处理追溯)
    销售订单的四个主要环节和每个环节用到的常用表
  • 原文地址:https://www.cnblogs.com/wwg945/p/8259972.html
Copyright © 2011-2022 走看看