zoukankan      html  css  js  c++  java
  • pymysql模块操作数据库

     一、连接数据库登录验证示例 

    import pymysql
    
    username = input("username:")
    password = input("password:")
    
    conn = pymysql.connect(  # 连接数据库
        user="root",
        password="",
        host="localhost",
        port=3306,  # 端口号是数字类型,不要加引号!!!
        database="TestDB",
        charset="utf8")  # charset="utf8",不要写成 utf-8 !!!
    
    cursor = conn.cursor()  # 获取输入sql语句的光标对象
    sql = "select * from userinfo where username=%s and password=%s"
    ret = cursor.execute(sql, (username, password))  # 执行sql语句
    # sql = "select * from userinfo where username=%(user)s and password=%(pwd)s"
    # ret = cursor.execute(sql, {"user": username, "pwd": password})
    
    if ret:
        print("Connection succeeded")
    else:
        print("Connection failed")
    cursor.close()  # 关闭光标对象
    conn.close()  # 关闭连接
    View Code

     二、基本使用 

     2.1 创建数据库 

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = """create table xx(
            id int auto_increment primary key,
            name char(10) not null unique,
            age int not null
            )engine=innodb default charset=utf8"""
    cursor.execute(sql)
    cursor.close()
    db_conn.close()
    View Code

     2.2 查找数据时返回字典格式的数据 

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor(pymysql.cursors.DictCursor)
    sql = "select * from userinfo"
    cursor.execute(sql)
    ret = cursor.fetchall()
    print(ret)
    cursor.close()
    db_conn.close()
    View Code

    如果只是 cursor = conn.cursor() ,没有加上上面那些代码,返回的是元祖格式的数据:

     三、pymysql增删改查操作 

     3.1 增 insert 

    ①普通版插入数据

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "insert into userinfo(username, password) values(%s,%s)"
    username = "peter"
    password = 123456
    cursor.execute(sql,(username,password))
    db_conn.commit()  # 提交事务!!!一定要记得写!!!
    cursor.close()
    db_conn.close()

    ②插入数据失败回滚

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "insert into userinfo(username, password) values(%s,%s)"
    username = "peter"
    password = 123
    try:
        cursor.execute(sql,(username,password))
        db_conn.commit()  # 提交事务
    except Exception as e:
        print("Error:%s" % e)
        db_conn.rollback()  # 有异常,回滚事务
    finally:
        cursor.close()
        db_conn.close()

    因为设计表的时候,用户名(username)设置唯一,且上面已经插入一条用户名为 peter 的用户,所以再次插入相同的用户名将会失败,所以使用了异常处理以及回滚事务。或者当用户名和密码,即使其中一个为空的时候,插入数据也会不成功。

    ③获取刚插入数据的ID值(关联操作要用到)

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql_cla = "insert into class (name) values(%s)"
    sql_stu = "insert into student (name, classid) values(%s,%s)"
    
    try:
        cursor.execute(sql_cla,"跆拳道")
        pre_id = cursor.lastrowid  # 获取刚才插入数据的ID值
        cursor.execute(sql_stu,("女汉子",pre_id))
        db_conn.commit()  # 提交事务
    except Exception as e:
        db_conn.rollback()  # 有异常,回滚事务
    finally:
        cursor.close()
        db_conn.close()

    课程表:

    学生表:

    可以看到课程表有刚插入的跆拳道课程,同时学生表有一个叫做"女汉子"的学生关联到了相应的课程ID。

    ④批量插入数据

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "insert into student (name, classid) values(%s,%s)"
    data = (("A","1"),("B","2"),("C","3"))
    try:
        ret = cursor.executemany(sql,data)  # 插入多条数据;ret为受影响的行数
        print(ret)  # 3
        db_conn.commit()  # 提交事务
    except Exception as e:
        db_conn.rollback()  # 有异常,回滚事务
    finally:
        cursor.close()
        db_conn.close()

     3.2 删 delete 

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "delete from student where name=%s"
    name = "女汉子"
    try:
        cursor.execute(sql,name)
        db_conn.commit()
    except Exception as e:
        db_conn.rollback()
    finally:
        cursor.close()
        db_conn.close()
    View Code

     3.3 改 update 

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "update student set name=%s, classid=%s where id=%s"
    name = "女汉子"
    classid = 3
    id = 2
    try:
        cursor.execute(sql,(name,classid,id))
        db_conn.commit()
    except Exception as e:
        db_conn.rollback()
    finally:
        cursor.close()
        db_conn.close()
    View Code

     3.4 查 select 

    ①从查到的结果中取单条数据 fetchone()

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "select * from student where id=1"
    cursor.execute(sql)
    ret1 = cursor.fetchone()  # fetchone只取一条数据
    print(ret1)  # (1, '学生1', 1)
    ret2 = cursor.fetchone()  # 再取数据,取不到不会报错,返回None
    print(ret2)  # None
    cursor.close()
    db_conn.close()
    View Code

    ②从查到的结果中取多条数据 fetchmany()

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "select * from student where id<10"
    cursor.execute(sql)
    ret1 = cursor.fetchone()  # fetchone只取一条数据
    print(ret1)  # (1, '学生1', 1)
    ret2 = cursor.fetchmany(3)
    print(ret2)  # ((2, '学生2', 1), (3, '学生3', 2), (4, '学生4', 2))
    cursor.close()
    db_conn.close()
    View Code

    ③从查到的结果中取全部数据 fetchall()

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "select * from student where id<=10"
    cursor.execute(sql)
    ret1 = cursor.fetchone()  # fetchone只取一条数据
    print(ret1)  # (1, '学生1', 1)
    ret2 = cursor.fetchmany(3)
    print(ret2)  # ((2, '学生2', 1), (3, '学生3', 2), (4, '学生4', 2))
    ret3 = cursor.fetchall()
    print(ret3)  # ((5, '学生5', 3), (6, '学生6', 3), (7, '学生7', 4), (8, '学生8', 4), (9, '学生9', 5), (10, '学生10', 5))
    cursor.close()
    db_conn.close()

    其他操作

    cursor.scroll(3,mode="absolute")  # 相对绝对位置移动光标,写多少就是移到多少
    cursor.scroll(2,mode="relative")  # 相对当前光标位置再往后移动多少

    绝对位置移动光标取数据示例

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "select * from student"
    
    cursor.execute(sql)
    cursor.scroll(0,mode="absolute")  # 从0开始取,即表中的ID=1的位置
    ret1 = cursor.fetchmany(2)  # 往后取2个数据
    print(ret1)  # ((1, '学生1', 1), (2, '学生2', 1))
    
    cursor.scroll(2,mode="absolute")  # 从2开始取,即表中的ID=3的位置
    ret2 = cursor.fetchmany(2)  # 往后取2个数据
    print(ret2)  # ((3, '学生3', 2), (4, '学生4', 2))
    
    cursor.close()
    db_conn.close()
    View Code

    相对当前位置移动光标取数据示例

    import pymysql
    
    db_conn = pymysql.connect(
        user="root",
        password="",
        host="localhost",
        port=3306,
        database="TestDB",
        charset="utf8")
    
    cursor = db_conn.cursor()
    sql = "select * from student"
    
    cursor.execute(sql)
    ret1 = cursor.fetchmany(3)
    print(ret1)  # ((1, '学生1', 1), (2, '学生2', 1), (3, '学生3', 2))
    
    cursor.scroll(2,mode="relative")  # 本来光标在ID=3位置的后面,然后相对当前位置往后移动了2位,即光标现在处于ID=5位置的后面
    ret2 = cursor.fetchmany(2)  # 往后取2个数据,即取ID=6,7位置的数据
    print(ret2)  # ((6, '学生6', 3), (7, '学生7', 4))
    
    cursor.close()
    db_conn.close()
    View Code
  • 相关阅读:
    R语言大小写字母转换
    SparkR(R on Spark)编程指南 含 dataframe操作
    SparkR(R on Spark)编程指南 含 dataframe操作
    R-table和tapply函数
    r table
    多变量频率统计——r
    R语言-查看加载包、卸除加载包及安装包与卸载包
    flask 电子邮件进阶实践-用模板发送163邮件 --
    flask 电子邮件Flask-Mail --
    数据库进阶实践-事件监听 --
  • 原文地址:https://www.cnblogs.com/believepd/p/9849011.html
Copyright © 2011-2022 走看看