zoukankan      html  css  js  c++  java
  • python 操作 MySQL

    MySQL 数据库

    数据库指的是以一定方式存储在一起、能为多个用户共享、具有尽可能晓得冗余度、与应用程序彼此独立的数据集合。

    到目前位置,地球上有三种类型的数据:

    • 关系型数据库:MySQL、Microsoft Access、SQL Server、Oracle……
    • 非关系型数据库:MongoDB、BigTable(Google)、……
    • 键值数据库:Apache Cassandra(Facebook)、LevelDB(Google)……

    在此,只是简单介绍 python 如何去连接 mysql 数据库并做一些简单的操作

    python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程借口。
    python 数据库接口支持非常多的数据库。你可以访问python 数据库接口及 API查看详细的支持数据库列表。

    python 的 DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。
    Python DB-API 使用流程:

    • 引入 API 模块
    • 获取与数据库的连接
    • 执行 SQL 语句和存储过程
    • 关闭数据库连接

    Mysql 游标

    游标定义:在操作 MySQL 的时候我们知道 MySQL 检索操作返回一组称为结果集的行。这组返回的行都是与 SQL 语句相匹配的行(零行或多行)。使用简单的 select 语句,例如,没有般大得到第一行、下一行或者前十行,也不存在每次一行的处理所有行的简单办法(相对于成批的处理它们)。有时,需要在检索出来的行中间前进或者后退一行或多行。这就是使用游标的原因。游标(cursor)是一个存储在 MySQL 服务器上的数据库查询,它不是一条 select 语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据滚动或者浏览器中的数据。游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或作出更改。
    注意:不想多数 DBMS,MySQL游标只能用于存储过程(和函数)
    个人理解:游标相当于将 select 的结果存起来,当你需要多少就去那儿取;不像 select 语句把结果全部展示给你。

    数据库连接池

    官方:数据库连接池(Connection pooling)是程序启动是建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中的连接进行申请、使用、释放。

    个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

    数据库连接池的运行机制

    1. 数据初始化时创建连接池
    2. 使用时向连接池申请可用连接
    3. 使用完毕,将连接返还给连接池
    4. 程序退出时,断开所有连接,并释放资源

    如下图示:
    连接池运行机制

    在 python 中也有模块来创建 MySQL 连接池
    模块名为 DButils,可以通过pip install DButils安装

    import MySQLdb
    from DBUtils.PooledDB import PooledDB
    
    db_config = {
        'host' : '192.168.189.100',
        'user' : 'root',
        'passwd' : '',
        'db' : 'test',
        'port' : 33066
    }
    # conn = MySQLdb.connect(**db_config)
    conn_pool = PooledDB(MySQLdb, maxcached=5, **db_config)
    # print dir(conn_pool.connection())
    
    conn = conn_pool.connection()
    cur = conn.cursor()
    SQL = 'select * from student'
    
    cur.execute(SQL)
    result = cur.fetchall()
    print result
    
    #结果为
    #((1L, 'zhangsan'), (2L, 'wangwu'), (3L, 'wangwu'), (4L, 'wagwu'))
    

    安装 python-MySQLdb

    python-MySQLdb 是一个接口程序,python 通过它对 mysql 数据实现各种操作。

    如果要源码安装,可以这里下载: python-MySQLdb

    连接 MySQL 数据库

    import MySQLdb
    
    db_config = {
        'host' : '192.168.189.100',    #填写主机名(string)
        'user' : 'root',               #填写登录用户(string)
        'passwd' : 'XXXXXX',           #填写登录密码(string)
        'db' : 'test',                 #选择数据库(string)
        'port' : 33066                 #填写端口(int)
        'charset':'utf-8'              #设定字符集
    }
    
    try:
        conn = MySQLdb.connect(**db_config)
    except Exception as e:
        raise e
    finally:
        print " mysql 连接成功!"
    

    其实,关于 connect 的参数还有很多,可以阅读源码。不过,上面几个是常用的,其他的看情况使用。

    python 操作数据库

    python 建立了与数据的连接,其实是建立了一个MySQLdb.connect()的实例对象,或者泛泛的称为连接对象,python就是通过连接对象和数据库对话。这个对象常用的方法有:

    • commit():如果数据库表进行了修改,提交保存当前的数据。如果此用户没有权限就什么也不会发生。
    • rollback():回滚操作
    • cursor([cursorclass]):返回连接的游标对象。通过游标执行 SQL 查询并检查结果。游标比连接支持更多的方法,而且可能在程序中更好用。
    • close():关闭连接。此后,连接对象和游标都不再可用了

    Python和数据之间的连接建立起来之后,要操作数据库,就需要让python对数据库执行 SQL 语句。python是通过游标执行 SQL 语句的。所以,连接建立之后,就要利用连接对象得到游标对象,方法如下:

    cur = conn.cursor()
    print type(cur)         # 结果为: <class 'MySQLdb.cursors.Cursor'>
    

    此后,就可以利用游标对象的方法对数据库进行操作。游标对象的常用方法:

    名称 描述
    close() 关闭游标,之后游标不可用
    execute(query[,args]) 执行一条 SQL 语句,可以带参数
    executemany(query,pseq) 对序列 pseq 中的每个参数执行 SQL 语句
    fetchone() 返回一条查询结果
    fetchmany([size]) 返回 size 条结果
    nextset() 移动到下一个结果
    scroll(value,mode='relative') 移动游标到指定行,如果mode='relative',则表示从
    当前所在行移动 value 条,如果mode='absolute',则
    表示从结果集的第一行移动 value 条

    插入数据

    例如,要在数据表 student 中插入一条记录,使得:id = 2,name = 'wangwu',,可以这样做

    cur.execute("insert into student(id,name) values (%s,%s);",(2,'wangwu'))
    conn.commit()
    cur.close()
    conn.close()
    
    

    插入多条语句

    例如,要在数据表 student 中插入多条记录,使得:id = 5,name = 'zhao';id = 6,name = 'qian',可以这样做

    add_list = [(5,'zhao'),(6,'qian')]
    cur.executemany('insert into student(id,name) values (%s,%s)',add_list)
    conn.commit()
    cur.close()
    conn.close()
    

    读取操作

    任何数据库上的读操作表示要从数据库中读取一些有用的信息。
    在建立数据库连接后,就可以对此数据库进行查询了。可以使用 fetchone()方法获取单条记录或fetchall()方法从数据库表中获取多个值。

    • fetchone() - 获取查询结果集的下一行。结果集是当使用游标对象来查询表时返回的对象
    • fetchall() - 获取结果集中的所有行。如果已经从结果集中提取了一些行,则从结果集中检出剩余的行。
    • rowcount - 这是一个只读属性,并返回受 execute() 方法影响的行数。
    cur.execute("select * from student;")
    result = cur.fetchall()
    print result
    
    # 返回元素是元组
    ((1L, 'zhangsan'), (2L, 'wangwu'), (3L, 'wangwu'), (4L, 'wagwu'))
    

    移动游标

    通过游标找出来的对象,在读取的时候有一个特点,就是那个游标会移动。在第一次操作了 print cur.fetchall()后,因为是将所有的对象都打印出来,游标就从第一条移动到最后一条。当print结束后,游标已经在最后一条的后面了。接下来如果再次打印,游标已经指到最后,将会返回空。

    fetchone() - 游标会一列一列向下移动
    fetchall() - 游标会从最开始一下移动到最后

    不过我们可以使用 scroll() 来手动移动游标。

    cur.scroll(n)或者cur.scroll(n,'relative'):意思是相对当前位置向上或者向下移动,n为正数,表示向下,n为负数,表示向上

    cur.scroll(n,'absolute'):与相对当前位置移动相反,n指定序列对象,序列对象的顺序是从0开始的。

    cur.scroll(2,'absolute')    #回到序号是2,但指向第三条
    
    cur.scroll(0,'absolute')    #回到序号是0,即指向tuple的第一条
    

    转换元组元素类型

    默认情况下,游标返回的对象的类型为元组组成的元组,
    而且可以看到游标类为 MySQLdb.cursors.Cursor。我们可以转换元组内的元素类型,将元组转换为字典,方便读取"key-value"

    # 创建游标对象,添加一条记录
    cur = conn.cursor()
    print type(cur)
    # 查看一条记录
    cur.execute("select * from student;")
    result = cur.fetchone()
    print result
    
    # 结果为:
    <class 'MySQLdb.cursors.Cursor'>
    (1L, 'zhangsan')
    

    将游标默认引用的类修改为MySQLdb.cursors.DictCursor,生成字典组成的列表:

    # 创建游标对象,添加一条记录
    cur = conn.cursor(MySQLdb.cursors.DictCursor)
    print type(cur)
    # 查看一条记录
    cur.execute("select * from student;")
    result = cur.fetchone()
    print result
    
    # 结果为:
    <class 'MySQLdb.cursors.DictCursor'>
    {'id': 1L, 'name': 'zhangsan'}
    

    可以更加方便取值。

    值得注意的一点是:当你操作数据完毕,“不要忘记关门”

    cur.close()     #关闭游标,相当与对象缓存的地方
    conn.close()    #关闭数据库连接
    
    
  • 相关阅读:
    转ico的网站
    npm install时 报错Maximum call stack size exceeded
    vue的props和$emit / 父子组件通信。别看其他人的了,我这个例子清晰,肯定可用的。
    Cannot reinitialise DataTable 问题
    dataTable 加了竖向滚动条导致列头样式错位的问题 / 亲测可用,不好用你打我,用好了记得点推荐
    MongoDB基本语句
    学生信息系统(json模块解决数据持久化)
    0428(字典,列表,循环)
    用python复制图片、视频
    Python库的安装
  • 原文地址:https://www.cnblogs.com/pingqiang/p/7868809.html
Copyright © 2011-2022 走看看