python学习—Day27—mysql游标、连接池、表结构
来源:互联网 发布:php 数据录入系统 编辑:程序博客网 时间:2024/06/16 06:26
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
- python学习—Day27—mysql游标、连接池、表结构
- python 游标、MySQL连接池、设计表
- MySQL游标和控制结构代码学习
- 六周二次课(11月21日) 12.5 游标 12.6 mysql连接池 12.7 设计表结构
- day27—PL/SQL和分页功能
- 【Python学习】Python连接MySQL
- Python操作MySQL-(2)连接对象和游标对象
- java学习day27
- Python 学习入门(4)—— 连接MySQL
- Python 学习入门(4)—— 连接MySQL
- Oracle学习—游标
- Python学习:连接MySQL数据库
- Day27
- day27
- Python连接Mysql 连接池
- mysql学习之游标
- Python MySQL 连接池
- Python -mysql 连接池
- apache-server
- 关于nginx的一点记录
- mysql索引
- 学富五车,口才似硅谷高晓松,他要用一年的时间说尽硅谷“秘史”
- 数据分析可视化工具面临业务技术双挑战(下)
- python学习—Day27—mysql游标、连接池、表结构
- 【头条】多云下的数据韧性需求,Veritas又有哪些突破性进展?
- qml坑之Invalid signal parameter type: list
- 关于过滤器使用了参数后,接口获取不到参数问题
- IDEA打jar包
- systemverilog 参数化类及与静态的关系
- Android的设计模式-单例模式
- Unity接入微信SDK——iOS(接入微信SDK)
- 改善异步调用代码的写法