一、游标
游标是系统为用户开设的一个数据缓冲区,存放sql语句的执行结果
用户可以用sql语句逐一从游标中获取记录,并赋予主变量,交由python进一步处理,一组主变量一次只能存放一条记录。
常用方法:
cursor():创建游标对象
close():关闭游标对象
fetchone():得到结果集的下一行
fetchmany([size=curor.arraysize]):得到结果集的下几行
fetchall(): 得到结果集中的剩下的所有行
execute(sql) : 执行一个数据库查询或命令
executemany(sql, args) : 执行多个数据库查询或命令
实例:
1
mysql> select * from test;
+-----+
| id |
+-----+
| 100 |
| 1 |
| 2 |
| 3 |
| 4 |
| 6 |
| 7 |
| 10 |
| 106 |
+-----+
# cat demon3.py
#!/usr/bin/python
#-*- coding:utf-8 -*-
from mysql_conn import connect_mysql
if __name__ == '__main__':
sql = 'select * from test;'
cnx = connect_mysql()
cus = cnx.cursor()
try:
cus.execute(sql)
result = cus.fetchone()
print(result)
result_many = cus.fetchmany(3)
result_all = cus.fetchall()
print(result_many)
print(result_all)
cus.close()
except Exception as e:
cnx.rollback()
raise e
finally:
cus.close()
结果:
# python demon3.py
(100L,)
((1L,), (2L,), (3L,))
((4L,), (6L,), (7L,), (10L,), (106L,))
2
#!/usr/bin/python
#-*- coding:utf-8 -*-
from mysql_conn import connect_mysql
if __name__ == '__main__':
sql = 'select * from test;'
sql_many = 'insert into test(id) value (%s);'
param = []
for i in xrange(200,210):
param.append([str(i)])
print(param)
cnx = connect_mysql()
cus = cnx.cursor()
try:
cus.execute(sql)
cus.executemany(sql_many, param)
result = cus.fetchone()
print(result)
result_many = cus.fetchmany(3)
result_all = cus.fetchall()
print(result_many)
print(result_all)
cus.close()
cnx.commit()
except Exception as e:
cnx.rollback()
raise e
finally:
cus.close()
结果
mysql> select * from test;
+-----+
| id |
+-----+
| 100 |
| 1 |
| 2 |
| 3 |
| 4 |
| 6 |
| 7 |
| 10 |
| 106 |
| 200 |
| 201 |
| 202 |
| 203 |
| 204 |
| 205 |
| 206 |
| 207 |
| 208 |
| 209 |
+-----+
19 rows in set (0.00 sec)
a、先建立mysql连接对象
b、创建游标
c、获取数据
二、mysql连接池
使用数据库的连接池技术,来访问数据库达到资源复用的目的
python的数据库连接池包 DBUtils:
DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装
DBUtils提供两种外部接口:
* PersistentDB :提供线程专用的数据库连接,并自动管理连接。
* PooledDB :提供线程间可共享的数据库连接,并自动管理连接。
使用pip安装:
Pip install DBUtils
实例:
# cat demon4.py
#!/usr/bin/python
#-*- coding:utf-8 -*-
import MySQLdb
from DBUtils.PooledDB import PooledDB
db_config = {
'host' : 'localhost',
'port' : 3306,
'user' : 'test',
'passwd' : '123456',
'db' : 'python',
}
pool = PooledDB(MySQLdb, 5, **db_config)
# 5为连接池里的最少连接数
if __name__ == '__main__':
cnx = pool.connection()
# 以后每次需要数据库连接就是用connection()函数获取连接就好了
cus = cnx.cursor()
SQL = 'select * from test;'
try:
cus.execute(SQL)
result = cus.fetchall()
print(result)
cus.close()
cnx.commit()
except Exception as e:
raise e
finally:
cnx.close()
PooledDB的参数:
1. mincached,最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接
2. maxcached,最大的空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接
3. maxconnections,最大的连接数,
4. blocking,当连接数达到最大的连接数时,在请求连接的时候,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于最大连接数,如果这个值是False,会报错,
5. maxshared 当连接数达到这个数,新请求的连接会分享已经分配出去的连接
连接池对性能的提升表现在:
1.在程序创建连接的时候,可以从一个空闲的连接中获取,不需要重新初始化连接,提升获取连接的速度
2.关闭连接的时候,把连接放回连接池,而不是真正的关闭,所以可以减少频繁地打开和关闭连接
三、设计表结构
根据自己的业务需要和属性,设计不同的表结构,设计的表结构:
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)
否
老师名字