在廖雪峰的教程实战项目中,构建WebApp首先第一步就是编写ORM,ORM全称“Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。
ORM就涉及到对数据库(在本例中是MySQL)的操作。首先,创建连接池,然后封装增删改查等操作。
一、连接池是啥
官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。
传统统链接: 一般来说,Java应用程序访问数据库的过程是:
①装载数据库驱动程序;
②通过JDBC建立数据库连接;
③访问数据库,执行SQL语句;
④断开数据库连接。
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
二、具体代码
创建连接池的代码如下:
async def create_pool(loop, **kw): logging.info('create database connection pool...') global __pool __pool = await aiomysql.create_pool( host=kw.get('host', 'localhost'), port=kw.get('port', 3306), user=kw['user'], password=kw['password'], db=kw['db'], charset=kw.get('charset', 'utf8'), autocommit=kw.get('autocommit', True), maxsize=kw.get('maxsize', 10), minsize=kw.get('minsize', 1), loop=loop )请注意:使用了async和await关键字,这是一个coroutine(协程)。子程序调用是通过栈实现的,一个线程就是执行一个子程序。
子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。
协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
这个协程的参数:
接受一个loop(事件循环)和一个kw(关键字参数,即dict)。可以看出dict中的key应当包括host,port,user,password,db,charset,autocommit,maxsize,minsize。
这个协程干了啥:
这个协程首先声明了全局变量__pool,然后调用了aiomysql.creat_pool()函数,并把返回值赋值给了__pool。
这个协程无返回值。