• pymysql的使用


    数据库开发

    驱动

    MySQL基于TCP协议之上开发,但是网络连接之后,传输的数据必须遵循MySQL的协议.封装好MySQL协议的包,就是驱动程序.

    MySQL的驱动

    连接connect

    先建立一个数据传输的数据通道--连接.

    pymysql.connect()方法返回的是connections模块下的connection类实例.

    connect方法传参就是给connection类的__init__提供参数

    connection初始化参数 说明
    host 主机
    user 用户名
    password 密码
    database 数据库
    port 端口

    connection.ping()方法,测试数据库服务器是否存活,有一个参数reconnect表示断开与服务器连接是否重连.

    游标cursor

    操作数据库,必须使用游标,首先要获取一个游标对象.

    connection.cousor(cursor=none)方法返回一个新的游标对象.

    连接没有过关闭前,游标对象可以反复使用.

    cursor参数,可以指定一个cursor类,如果为none,默认使用cursor类.

    操作数据库

    数据库操作需要使用cursor类的实例,提供execute()方法,执行SQL语句,成功返回影响的行数.

    增删相同,注意要conn.commit() ,sql语句实现具体功能

    import pymysql
    
    ### 连接数据库的参数
    conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
    # cursor = conn.cursor() ### 默认返回的值是元祖类型
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)
    
    
    sql = "insert into user (name, password) values (%s,  %s)"
    
    cursor.execute(sql, ('dshadhsa', 'dbsjabdjsa'))  ### 新增一条数据
    
    print(cursor.lastrowid)   ### 获取最后一行的ID值
    
    # data = [
    #     ('zekai1', 'qwe'),
    #     ('zekai2', 'qwe1'),
    #     ('zekai3', 'qwe2'),
    #     ('zekai4', 'qwe3'),
    # ]
    # cursor.executemany(sql, data)  ### 新增多条数据
    
    #### 加如下代码
    conn.commit()
    
    cursor.close()
    conn.close()
    

    增删相同,注意要conn.commit() ,sql语句实现具体功能

    删除重建

    import pymysql
    
    conn = pymysql.connect(host= "localhost",user='root',password='******',database='homework2',chatset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    
    sql = 'select * from teacher_info'
    cursor.execute(sql)
    
    cursor.close()
    conn.close()
    

    新增记录

    使用insert into 语句插入数据.需要手动进行数据管理.

    事务管理

    connection类的三个方法:

    begin开始事务

    commit将变更事务提交

    rollback回滚事务

    一般流程

    • 建立连接
    • 获取游标
    • 执行SQL
    • 提交事务
    • 释放资源
    查询

    cursor类的获取查询结果集的方法有fetchone(),fetchmany(size,none),fetchall()

    • fetchone()方法,获取结果集的下一行

    • fetchmany(size=none)方法,size指定返回的行数的行,none返回空元组.

    • fetchall()方法,获取所有行

    ​ 返回多行,如果走到末尾,就返回空元组,否则返回一个元组,其元素就是每一行的记录.

    ​ 每一行的记录也封装在一个元组中.

    cursor.rownumber放回当前行号.可以修改,支持负数.

    cursor.rowcount返回总行数

    注意:fetch操作的是结果集,结果集是保存在客户端的,也就是说fetch的时候,查询已经结束了.

    带列名查询

    cursor类的一个mixin的字类DictCursor.

    使用cursor=conn.cursor(DictCursor)就可以了

    返回一行,是一个字典

    返回多行,放在列表中,元素是字典,代表行

    SQL注入攻击

    猜测后台数据库的查询语句使用拼接字符串的方式,从而经过设计为服务器传参,令其拼接处特殊字符串,返回用户想要的结果.

    参数化查询,可以有效防止注入攻击,并提高查询的效率.

    ### 连接数据库的参数
    conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
    # cursor = conn.cursor() ### 默认返回的值是元祖类型
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)
    
    # sql = "select * from user where name='%s' and password='%s'" % (user, pwd)
    sql = "select * from user where name=%s and password=%s"
    
    cursor.execute(sql, (user, pwd))
    res = cursor.fetchall()  ###取出所有的数据 返回的是列表套字典
    print(res)
    
    cursor.close()
    conn.close()
    
    上下文支持

    查看连接类和游标类的源码

    连接类进入上下文的时候会返回一个游标对象,退出时如果没有异常会提交更改.

    游标类也使用上下文,在退出时关闭游标对象.

    conn的with进入是返回一个新的cursor对象,退出时,只是提交或者回滚了事务,并没有关闭cursor和conn

    不关闭cursor就可以接着用,省的反复创建.

  • 相关阅读:
    携程开源框架Apollo基础学习(一)
    nslookup,dig,host的用法详解
    curl命令学习
    Saltstack本地管理无master模式
    Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?
    JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
    #{}和${}的区别是什么?
    为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
    MyBatis 与 Hibernate 有哪些不同?
    MyBatis 的好处是什么?
  • 原文地址:https://www.cnblogs.com/agsol/p/11772500.html
Copyright © 2020-2023  润新知