Flask入门(二)之偏函数、数据库连接池(DBUtils)

上一篇文章>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)

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',)

下一篇文章>Flask入门(三)之信号、MetaClass、Session、WTForms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wielun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值