20171121_Python学习六周二次课(11月21日)

任务:

12.5 游标
12.6 mysql连接池
12.7 设计表结构

笔记:

a)      游标操作

我们先来看一个例子:

接下来,我们通过python代码增加一条数据到数据库中,代码如下:

import MySQLdb

def connect_mysql():

db_config = {

‘host‘: ‘192.168.48.128‘,

‘port‘: 3306,

‘user‘: ‘xiang‘,

‘passwd‘: ‘123456‘,

‘db‘: ‘python‘,

‘charset‘: ‘utf8‘

}

cnx = MySQLdb.connect(**db_config)

return cnx

if __name__ == ‘__main__‘:

cnx = connect_mysql()

cus = cnx.cursor()

sql  = ‘‘‘ create table test(id int not null);insert into test(id) values (100);‘‘‘

try:

cus.execute(sql)

cus.close()

cnx.commit()

except Exception as e:

cnx.rollback()

print(‘Error‘)

# raise e

finally:

cnx.close()

结果:

Error

查看数据库中的数据:select * from employees;并没有发生变化

解释:

在我们插入数据雇佣时间字段:hire_date的时候,故意把时间写错,导致异常发生,捕获到异常之后,打印Error,最后关闭mysql连接。cus = cnx.cursor()是创建一个游标对象,具体我们在后面进行介绍。

1,创建游标对象

Import MySQLdb

db_config = {

‘host‘: ‘192.168.48.128‘,

‘port‘: 3306,

‘user‘: ‘xiang‘,

‘passwd‘: ‘123456‘,

‘db‘: ‘python‘,

‘charset‘: ‘utf8‘

}

cnx = MySQLdb.connect(**db_config)

cus = cnx.cursor()

这样就是创建一个游标对象,以后我们对mysql的各种操作都是基于游标进行操作,后面我们将详细介绍。

在了解该方法之前,我们先来了解什么叫做游标,

游标(cursor)

  游标是系统为用户开设的一个数据缓冲区,存放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.48.128‘,

‘port‘: 3306,

‘user‘: ‘xiang‘,

‘passwd‘: ‘123456‘,

‘db‘: ‘python‘,

‘charset‘: ‘utf8‘

}

cnx = MySQLdb.connect(**db_config)

return cnx

if __name__ == ‘__main__‘:

cnx = connect_mysql()

cus = cnx.cursor()

sql  = ‘‘‘select * from
employees;‘‘‘

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()

结果:

result1:

(1001L, u‘lingjiang‘, u‘M‘,
datetime.date(2015, 4, 1))

result2:

((1002L, u‘xiang‘, u‘M‘,
datetime.date(2015, 4, 1)),)

result3:

((1003L, u‘shang‘, u‘M‘,
datetime.date(2015, 4, 1)),)

解释:

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

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

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

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

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

对于excute()和excutemany()的方法,我们会在以一节详细分析他们的区别。

执行多条语句的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()

b)    
数据库连接池

python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的。
python的数据库连接池包 DBUtils:
DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。DBUtils来自Webware for Python。
DBUtils提供两种外部接口:
* PersistentDB :提供线程专用的数据库连接,并自动管理连接。
* PooledDB :提供线程间可共享的数据库连接,并自动管理连接。
下载地址:https://pypi.python.org/pypi/DBUtils/   下载解压后,使用python setup.py install 命令进行安装
或者使用
Pip install DBUtils
 
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time    : 2017/9/18 22:46
# @Author  : lingxiangxiang
# @File    : demon4.py
 
 
import MySQLdb
from DBUtils.PooledDB import PooledDB
db_config = {
        "host": "192.168.48.128",
        "port": 3306,
        "user": "xiang",
        "passwd": "123456",
        "db": "python",
        "charset": "utf8"
    }
 
 
pool = PooledDB(MySQLdb, 5, **db_config)  # 5为连接池里的最少连接数
 
conn = pool.connection()  # 以后每次需要数据库连接就是用connection()函数获取连接就好了
cur = conn.cursor()
SQL = "select * from tmp;"
r = cur.execute(SQL)
r = cur.fetchall()
print(r)
cur.close()
conn.close()
 
PooledDB的参数:
1. mincached,最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接
2. maxcached,最大的空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接
3. maxconnections,最大的连接数,
4. blocking,当连接数达到最大的连接数时,在请求连接的时候,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于最大连接数,如果这个值是False,会报错,
5. maxshared 当连接数达到这个数,新请求的连接会分享已经分配出去的连接
 
在uwsgi中,每个http请求都会分发给一个进程,连接池中配置的连接数都是一个进程为单位的(即上面的最大连接数,都是在一个进程中的连接数),而如果业务中,一个http请求中需要的sql连接数不是很多的话(其实大多数都只需要创建一个连接),配置的连接数配置都不需要太大。
连接池对性能的提升表现在:
1.在程序创建连接的时候,可以从一个空闲的连接中获取,不需要重新初始化连接,提升获取连接的速度
2.关闭连接的时候,把连接放回连接池,而不是真正的关闭,所以可以减少频繁地打开和关闭连接

1.     建表

数据库键表,直接在python代码中执行,

#!/usr/bin/env python

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

# @Time    : 2017/5/5 13:56

# @Author  : lingxiangxiang

# @File    : aa.py

import MySQLdb

def connect_mysql():

db_config = {

‘host‘: ‘192.168.48.128‘,

‘port‘: 3306,

‘user‘: ‘xiang‘,

‘passwd‘: ‘123456‘,

‘db‘: ‘python‘,

‘charset‘: ‘utf8‘

}

cnx = MySQLdb.connect(**db_config)

return cnx

if __name__ == ‘__main__‘:

cnx = connect_mysql()

cus = cnx.cursor()

# sql  = ‘‘‘insert into student(id, name, age, gender, score) values (‘1001‘, ‘ling‘, 29, ‘M‘, 88), (‘1002‘, ‘ajing‘, 29, ‘M‘, 90), (‘1003‘, ‘xiang‘, 33, ‘M‘, 87);‘‘‘

student = ‘‘‘create table Student(

StdID int not null,

StdName varchar(100) not null,

Gender enum(‘M‘, ‘F‘),

Age tinyint

)‘‘‘

course = ‘‘‘create table Course(

CouID int not null,

CName varchar(50) not null,

TID int not null

)‘‘‘

score = ‘‘‘create table Score(

SID int not null,

StdID int not null,

CID int not null,

Grade int not null

)‘‘‘

teacher = ‘‘‘create table Teacher(

TID int not null,

TName varchar(100) not null

)‘‘‘

tmp = ‘‘‘set @i := 0;

create table tmp as select (@i := @i + 1) as id from information_schema.tables limit 10;

‘‘‘

try:

cus.execute(student)

cus.execute(course)

cus.execute(score)

cus.execute(thearch)

cus.execute(tmp)

cus.close()

cnx.commit()

except Exception as e:

cnx.rollback()

print(‘error‘)

raise e

finally:

cnx.close()

结果:

mysql> show tables;

+------------------+

| Tables_in_python |

+------------------+

| Course           |

| Score            |

| Student          |

| Teacher          |

| tmp              |

+------------------+

1        rows in set (0.00 sec)

没有任何异常,在数据库中查看表,出现这五个表。说明这五个表已经创建成功。

既然我们要搞,就尽可能的接近实战,我们来把数据搞大一点,语句设计的复杂一点,这样对我们以后接触到简单的sql语句时,就有很大的帮助。

首先我们先来了解一下information_schema这个库,这个在mysql安装时就有了,提供了访问数据库元数据的方式。那什么是元数据库呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。

information_schema数据库表说明:

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。

USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。

SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。

TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。

COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。

CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。

COLLATIONS表:提供了关于各字符集的对照信息。

COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。

TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。

KEY_COLUMN_USAGE表:描述了具有约束的键列。

ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。

TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表

而TABLES在安装好mysql的时候,一定是有数据的,因为在初始化mysql的时候,就需要创建系统表,该表一定有数据。

set @i := 0;

create table tmp as select (@i := @i + 1) as id from information_schema.tables limit 10;

mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。set这个是mysql中设置变量的特殊用法,当@i需要在select中使用的时候,必须加:,这样就创建好了一个表tmp,查看tmp的数据:

mysql> select * from tmp;

+------+

| id  
|

+------+

|   
1 |

|   
2 |

|   
3 |

|   
4 |

|   
5 |

|   
6 |

|   
7 |

|   
8 |

|   
9 |

|  
10 |

+------+

10 rows in set (0.00 sec)

我们只是从information_schema.tables表中取10条数据,任何表有10条数据也是可以的,然后把变量@i作为id列的值,分10次不断输出,依据最后select的结果,创建表tmp。

				
时间: 2024-08-30 12:44:07

20171121_Python学习六周二次课(11月21日)的相关文章

Week11(11月21日)

Part I:提问 =========================== 1.如何编辑更新一条记录? Part II:案例学习 =========================== MusicStore的开发故事(教程下载) 第9集:注册和结账(视频下载:1 , 2) 一.合并购物车 二.创建结账CheckoutController控制器 三.增加AddressAndPayment视图 四.定义订单的验证规则 五.增加完成结账视图 六.更新错误视图 第10集:完成导航和站点的设计(视频下载:

APICloud SDK_v1.0.71版本发布(2014年11月21日更新)

APICloud SDK_v1.0.71为开发APICloud App提供了一套完整的开发工具包,包括APICloudAppLoader,APICloud IDE,APICloud Framework,APICloudSamples.开发者使用这些工具可以开发APICloudApp,并同步输出iOS(.ipa)和Android(.apk)应用.另外,开发人员可以使用APICloudIDE进行应用开发,使用APICloud Simulator进行调试,使APICloud AppLoader进行真机

11月21日

数据库导入导出: 导出:右键需要导出的数据库→任务→导出数据→………… 导入:右键需要导入到的数据库→任务→导入数据→编辑映射→启用标志插入√→根据需要选择删除原有行或者增添行   truncate用法: truncate table score →清空score表中所有数据 功能与delete相同,但delete会产生工作日志,truncate为清空数据,不会产生工作日志.   delete数据收缩用法: delete→生成日志→数据收缩 (数据收缩花费大量时间) delete→生成日志→截断

团队博客-11月21日

今天任务是加一个可以连接打印机并提供打印功能的程序并归总所有的代码使得最后程序能正常运行, 一切任务完成后最后结果大体还是让我比较满意的吧. 燃尽图: 最后成果截图--一个例子: 原文地址:https://www.cnblogs.com/zhs20160715/p/9996900.html

11月28日全球域名商保有量及市场份额排行榜TOP16

IDC评述网(idcps.com)12月01日报道:根据RegistrarStats公布的实时数据显示,截止至2015年11月28日,全球域名注册保有量十六强名单顺序,与上期11月21日保持一致,中国依旧占据3个席位,分别是中国万网.易名中国.新网,排名分列7..10.16名.下面,请看IDC评述网对数据的整理与分析. (图1)全球域名注册商(国际域名)保有量市场份额TOP16 如图1所示,截止至2015年11月28日,在全球域名注册市场上,GODADDY.COM份额依旧最大,第二名eNom与之

学习笔记(11月14日)--正则

五周二次课(11月14日) 11.1 常用正则表达式 11.2 re正则对象和正则匹配效率比较 11.3 编译正则对象

学习笔记(11月06日) --类

四周一次课(11月6日) 一.类的一般形式 创建类我们一般用class关键字来创建一个类,class后面跟类名字,可以自定义,最后以冒号结尾,如下所示: class ClassName: '''类的说明''' 类的内容 类的内容可以写类的全局变量,方法等 例子: class ren(object):     '''this is a new class'''     name = 'meinv'     sex = 'woman' a = ren() print(type(a)) print(a

学习笔记(11月03日)

三周五次课(11月3日) 1.生成式和生成器 1.1列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理. 语法格式为: [exp for val in collection if condition] 相当于 result = [] for val in collection:     if (condition):         result.append(exp) 例子: a = [x * x for x in xrange

学习笔记(11月02日)--高阶函数

三周四次课(11月2日) 1.高阶函数 高级函数就是把函数当成参数传递的一种函数:例如: def add(x, y, f):     return f(x) + f(y) print(add(-8, 11, abs)) 结果: 19 解释: 1,调用add函数,分别执行abs(-8)和abs(11),分别计算出他们的值 2,最后再做和运算 map()函数 map函数是python内置的一个高阶函数,它接收一个函数f和一个list,并把list的元素依次传递给函数f,然后返回一个函数f处理完所有l