python学习—Day27—mysql游标、连接池、表结构

来源:互联网 发布:php 数据录入系统 编辑:程序博客网 时间:2024/06/16 01:00

mysql游标操作:

游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果

  用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由python进一步处理,一组主变量一次只能存放一条记录

  仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求

  1.游标和游标的优点

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。

常用方法:

cursor():创建游标对象
       close():关闭此游标对象
       fetchone():得到结果集的下一行
       fetchmany([size = cursor.arraysize]):得到结果集的下几行
       fetchall():得到结果集中剩下的所有行
       excute(sql[, args]):执行一个数据库查询或命令
       executemany (sql, args):执行多个数据库查询或命令


举例子:

import MySQLdb

def connect_mysql():

   db_config = {

       'host': '192.168.2.100',

       'port': 3306,

       'user': 'xiao',

       'passwd': '123456',

       'db': 'python',

       'charset': 'utf8'

    }

   cnx = MySQLdb.connect(**db_config)

   return cnx

 

if __name__ == '__main__':

   cnx = connect_mysql()

   cus = cnx.cursor()

   sql  = '''select * fromemployees;'''

   try:

       cus.execute(sql)

       result1 = cus.fetchone()

       print('result1:')

       print(result1)

       result2 = cus.fetchmany(1)

       print('result2:')

       print(result2)

       result3 = cus.fetchall()

       print('result3:')

       print(result3)        cus.close()

       cnx.commit()

   except Exception as e:

       cnx.rollback()

       print('error')

       raise e

   finally:

        cnx.close()

解释:

1,  先通过MySQLdb.connect(**db_config)建立mysql连接对象

2,  在通过 =cnx.cursor()创建游标

3,  fetchone():在最终搜索的数据中去一条数据

4,  fetchmany(1)在接下来的数据中在去1行的数据,这个数字可以自定义,定义多少就是在结果集中取多少条数据。

5,  fetchall()是在所有的结果中搞出来所有的数据。


执行多条语句的sql时要注意:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# @Time   : 2017/9/18 22:17

# @Author : lingxiangxiang

# @File   : domon3.py

from demon2 import connect_mysql

import MySQLdb

def connect_mysql():

   db_config = {

       "host": "192.168.48.128",

       "port": 3306,

       "user": "xiang",

       "passwd": "123456",

       "db": "python",

       "charset": "utf8"

    }

   try:

       cnx = MySQLdb.connect(**db_config)

   except Exception as e:

       raise e

   return cnx

if __name__ == "__main__":

   sql = "select * from tmp;"

    sql1= "insert into tmp(id) value (%s);"

   param = []

   for i in xrange(100, 130):

       param.append([str(i)])

   print(param)

   cnx = connect_mysql()

   cus = cnx.cursor()

   print(dir(cus))

   try:

       cus.execute(sql)

       cus.executemany(sql1, param)

       # help(cus.executemany)

       result1 = cus.fetchone()

       print("result1")

       print(result1)

 

       result2 = cus.fetchmany(3)

       print("result2")

       print(result2)

 

       result3 = cus.fetchall()

       print("result3")

       print(result3)

       cus.close()

       cnx.commit()

 

   except Exception as e:

       cnx.rollback()

       raise e

   finally:

       cnx.close()


数据库连接池:

python的数据库连接池包 DBUtils
DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。DBUtils来自Webware for Python
 
DBUtils提供两种外部接口:
* PersistentDB :提供线程专用的数据库连接,并自动管理连接。
* PooledDB :提供线程间可共享的数据库连接,并自动管理连接。
下载地址:https://pypi.python.org/pypi/DBUtils/   下载解压后,使用python setup.py install 命令进行安装
或者使用
Pip install DBUtils


具体操作,需要之后进行:

PooledDB的参数:
1. mincached,最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接
2. maxcached,最大的空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接
3. maxconnections,最大的连接数,
4. blocking,当连接数达到最大的连接数时,在请求连接的时候,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于最大连接数,如果这个值是False,会报错,
5. maxshared 当连接数达到这个数,新请求的连接会分享已经分配出去的连接
 
uwsgi中,每个http请求都会分发给一个进程,连接池中配置的连接数都是一个进程为单位的(即上面的最大连接数,都是在一个进程中的连接数),而如果业务中,一个http请求中需要的sql连接数不是很多的话(其实大多数都只需要创建一个连接),配置的连接数配置都不需要太大。
连接池对性能的提升表现在:
1.在程序创建连接的时候,可以从一个空闲的连接中获取,不需要重新初始化连接,提升获取连接的速度
2.关闭连接的时候,把连接放回连接池,而不是真正的关闭,所以可以减少频繁地打开和关闭连接

设计表结构:

现在,我们来详细讲讲python操作数据库的细节,在操作设计数据库之前,我们先要设计数据库表结构,我们就来分析分析经典的学生,课程,成绩,老师这几者他们之间的关系,我们先来分析各个主体他们直接有什么属性,并确定表结构,在实际开发过程中,根据自己的业务需要和属性,设计不同的表结构


设计如下的表结构,这是在项目开发之前必须进行的,并且非常重要。 

Student

字段名

类型

是否为空

主键

描述

StdID

int

学生ID

StdName

varchar(100)

 

学生姓名

Gender

enum('M', 'F')

 

性别

Age

tinyint

 

年龄

Course

字段名

类型

是否为空

主键

描述

CouID

int

课程ID

Cname

varchar(50)

 

课程名字

TID

int

 

老师ID

Score

字段名

类型

是否为空

主键

描述

SID

int

分数ID

StdID

int

 

学生id

CouID

int

 

课程id

Grade

int

 

分数

 

 

Teacher

字段名

类型

是否为空

主键

描述

TID

int

老师ID

Tname

varcher(100)

 

老师名字

 

数据库建表规范可以参照这里的网址:http://blog.csdn.net/dreamcode/article/details/8557197