上一篇文章
>Flask入门(一)之消息闪现、请求扩展、中间件、蓝图、上下文管理
一、补充
1、偏函数
#!/usr/bin/env python
# coding:utf-8
import functools
def fun(a, b):
print(a, b)
new_fun = functools.partial(fun, "aaa")
new_fun1 = functools.partial(fun, b="b1b1")
new_fun("bbb")
new_fun1(a='a1a1')
结果:
aaa bbb
a1a1 b1b1
2、面向对象
当把面向对象中的所有
__函数__
实现时,对象做任何操作时,都会执行其中对应的方法。
#!/usr/bin/env python
# coding:utf-8
class Foo(object):
def __init__(self, num):
self.num = num
def __add__(self, other):
data = self.num + other.num
# print(self.num, other.num)
return Foo(data)
obj1 = Foo(1)
obj2 = Foo(2)
# print(obj1.num, obj1)
# print(obj2.num, obj2)
v = obj1 + obj2
print(v.num, v)
结果:
3 <__main__.Foo object at 0x7fd772bb7278>
3、拼接列表中值(chain)
(1)拼接列表
#!/usr/bin/env python
#coding:utf-8
from itertools import chain
li1 = [1, 2, 3]
li2 = [4, 5, 6]
new_li = chain(li2, li1)
for i in new_li:
print(i)
结果:
4
5
6
1
2
3
(2)列表及函数
#!/usr/bin/env python
#coding:utf-8
from itertools import chain
def f1(x):
return x + 1
func1_list = [f1, lambda x:x-1]
def f2(x):
return x + 10
new_func_list = chain([f2],func1_list)
for fun in new_func_list:
print (fun)
二、数据库连接池
1、连接区别
- Django
- ORM(pymsql/MySQLdb)
- Flask
- 原生SQL
- pymsql(Python2/3,这里我们使用此方法)
- MySQLdb(Python2)
- SQLAchemy(ORM) (pymsql/MySQLdb)
- 原生SQL
2、DBUtils模块操作
(1)安装DBUtils
下载地址:https://pypi.org/project/DBUtils/#files
[root@Python ~]# wget https://files.pythonhosted.org/packages/c2/88/4f06764f776a691413ac1508f0c98097faddc076791da2620be6d146b222/DBUtils-1.3.tar.gz
[root@Python ~]# tar xf DBUtils-1.3.tar.gz
[root@Python ~]# cd DBUtils-1.3/
[root@Python DBUtils-1.3]# python setup.py install
(2)安装pymysql
下载地址:https://pypi.org/project/PyMySQL/#files
[root@Python ~]# wget https://files.pythonhosted.org/packages/da/15/23ba6592920e21cb40eb0fe0ea002d2b6177beb1ca8a4c1add5a8f32754d/PyMySQL-0.9.3.tar.gz
[root@Python ~]# cd PyMySQL-0.9.3/
[root@Python PyMySQL-0.9.3]# python setup.py install
(3)DBUtils二种连接模式
<1> 模式一
为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是重新放入到连接池中,供线程再次使用。当线程终止时连接才会关闭。
import pymysql
from DBUtils.PersistentDB import PersistentDB
POOL = PersistentDB(
creator=pymysql, ###使用连接数据库的模块
maxusage=None, ###一个链接最多被重复使用的次数,None表示无限制
setsession=[], ###开始会话前执行的命令列表。如:["xxx","xxxx"]
ping=0, ###ping MySQL服务端,检查服务是否可用,一般我们使用4或7,4常用。如:0=None:never,1=default:whenever it is requested(请求时检测),2:when a cursor is created(创建cursor检测),4:when a query is executed(query执行检测),7:always(一直)
closeable=False, ###如果为False,conn.close()实际上被忽略,供下次使用,线程关闭时才会关闭连接。如果为True时,conn.close()则关闭连接。那么再次调用pool.connection时就会报错
threadlocal=None, ###本线程独享得对象,用于保存链接对象,如果链接对象被重置
host='10.10.10.111',
port=3306,
user='root',
password='1',
database='pooldb',
charset='utf8',
)
def fun():
conn = POOL.connection(shareable=False)
cursor = conn.cursor()
cursor.execute('select * from tb')
res = cursor.fetchall()
cursor.close()
conn.close()
fun()
<2> 模式二
创建一批连接到连接池,供所有线程共享使用。
#!/usr/bin/env python
#coding:utf-8
import pymysql
from DBUtils.PooledDB import PooledDB
POOL = PooledDB(
creator=pymysql, ###使用连接数据库的模块
maxconnections=6, ###连接池最大连接数,0和None表示不限制
mincached=2, ###初始化时,连接池至少创建的空闲的链接,0和None表示不创建
maxcached=5, ###连接池中最多闲置的链接,0和None表示不限制
maxshared=3, ###连接池中最多共享的链接数量,0和None表示全部共享,由于pymysql和MySQLdb模块threadsafety都为1,所以设置无效果,结果是所有的都会被共享
blocking=True, ###连接池中如果没有可用连接后,是否阻塞等待。True:等待;False:不等待然后报错
maxusage=None, ###一个链接最多被重复使用的次数,None表示无限制
setsession=[], ###开始会话前执行的命令列表。如:["xxx","xxxx"]
ping=0, ###ping MySQL服务端,检查服务是否可用,一般我们使用4或7,4常用。如:0=None:never,1=default:whenever it is requested(请求时检测),2:when a cursor is created(创建cursor检测),4:when a query is executed(query执行检测),7:always(一直)
closeable=False, ###如果为False,conn.close()实际上被忽略,供下次使用,线程关闭时才会关闭连接。如果为True时,conn.close()则关闭连接。那么再次调用pool.connection时就会报错
threadlocal=None, ###本线程独享得对象,用于保存链接对象,如果链接对象被重置
host='10.10.10.111',
port=3306,
user='root',
password='1',
database='pooldb',
charset='utf8',
)
def fun():
conn = POOL.connection()
cursor = conn.cursor()
cursor.execute('select * from tb')
res = cursor.fetchall()
cursor.close()
conn.close() ###重新放回到连接池
fun()
(4)使用
下面2个都在同级目录下
db_helper.py:
#!/usr/bin/env python
#coding:utf-8
import pymysql
from DBUtils.PooledDB import PooledDB
POOL = PooledDB(
creator=pymysql, ###使用连接数据库的模块
maxconnections=6, ###连接池最大连接数,0和None表示不限制
mincached=2, ###初始化时,连接池至少创建的空闲的链接,0和None表示不创建
maxcached=5, ###连接池中最多闲置的链接,0和None表示不限制
maxshared=3, ###连接池中最多共享的链接数量,0和None表示全部共享,由于pymysql和MySQLdb模块threadsafety都为1,所以设置无效果,结果是所有的都会被共享
blocking=True, ###连接池中如果没有可用连接后,是否阻塞等待。True:等待;False:不等待然后报错
maxusage=None, ###一个链接最多被重复使用的次数,None表示无限制
setsession=[], ###开始会话前执行的命令列表。如:["xxx","xxxx"]
ping=0, ###ping MySQL服务端,检查服务是否可用,一般我们使用4或7,4常用。如:0=None:never,1=default:whenever it is requested(请求时检测),2:when a cursor is created(创建cursor检测),4:when a query is executed(query执行检测),7:always(一直)
closeable=False, ###如果为False,conn.close()实际上被忽略,供下次使用,线程关闭时才会关闭连接。如果为True时,conn.close()则关闭连接。那么再次调用pool.connection时就会报错
threadlocal=None, ###本线程独享得对象,用于保存链接对象,如果链接对象被重置
host='10.10.10.111',
port=3306,
user='root',
password='1',
database='pooldb',
charset='utf8',
)
class SQLHelper(object):
@staticmethod
def fetch_one(sql, args):
conn = POOL.connection()
cursor = conn.cursor()
cursor.execute(sql, args)
res = cursor.fetchone()
cursor.close()
conn.close()
return res
@staticmethod
def fetch_all(sql, args):
conn = POOL.connection()
cursor = conn.cursor()
cursor.execute(sql, args)
res = cursor.fetchall()
cursor.close()
conn.close()
return res
"""
另外一种写法:
class SQLHelper(object):
def __init__(self):
self.conn = POOL.connection()
self.cursor = self.conn.cursor()
def close(self):
self.cursor.close()
self.conn.close()
def fetch_one(self, sql, args):
self.cursor.execute(sql, args)
res = self.cursor.fetchone()
self.close()
return res
def fetch_all(self, sql, args):
self.cursor.execute(sql, args)
res = self.cursor.fetchall()
self.close()
return res
调用时必须实例化:
obj = SQLHelper()
obj.fetch_one()
"""
#!/usr/bin/env python
#coding:utf-8
from flask import Flask
app = Flask(__name__)
from db_helper import SQLHelper
@app.route('/')
def hello():
SQLHelper.fetch_all('执行SQL')
return "Hello World"
if __name__ == '__main__':
app.run(host='10.10.10.111',)