imjoey / blog

My Blog based on Github Issues.
286 stars 44 forks source link

sqlalchemy 与 flask-sqlalchemy #4

Open imjoey opened 7 years ago

imjoey commented 7 years ago

前言

flask是Python众多web框架中的一个,相比于django,flask是一个micro web framework,学习成本低,易上手。同时flask extension设计得非常方便,flask生态圈比较完善。sqlalchemy也是老牌的python ORM框架,其内置的events注册机制,可以灵活实现各种功能。flask-sqlalchemy则利用了flask和sqlalchemy易于扩展的优点,在flask中对sqlalchemy做了封装,为flask使用者节省了不少时间,少写代码,简化逻辑。本文对flask-sqlalchemy进行简单介绍。

flask-sqlalchemy在sqlalchemy基础上封装了什么

了解一下sqlalchemy的event注册方式

先看一段代码,这段代码是在生产环境中使用的,目的是保证在sqlalchemy在切换数据库后pool中connection依然可用(如果不加,访问已断开的connection会出错)

from sqlalchemy import exc
from sqlalchemy import event
from sqlalchemy.pool import Pool

@event.listens_for(Pool, "checkout")
def ping_connection(dbapi_connection, connectidon_record, connection_proxy):
    cursor = dbapi_connection.cursor()
    try:
        cursor.execute("SELECT 1")
    except:
    # optional - dispose the whole pool
    # instead of invalidating one at a time
    # connection_proxy._pool.dispose()

    # raise DisconnectionError - pool will try
    # connecting again up to three times before raising.
        raise exc.DisconnectionError()
    cursor.close()

这段代码的意思就是,每次都在connection从pool中取出后,通过一个“SELECT 1”来检测该connection是否可用,如果不可用,则通过raise exc.DisconnectionError()来重新从pool中获取可用的connection。 > 这样做会对性能有所损失,建议在频繁切换数据库情况下才加此listener

sqlalchemy中的两类event

通过使用sqlalchemy的listen函数、listens_for装饰器,就可以简单的实现event注册,在对应事件发生时执行指定函数。在sqlalchemy中有两大类event:

上面的代码,其实就是为Core Events中的connection pool lifecycle中,在为checkout注册一个监听函数。

sqlalchemy中的Core Events介绍

Pool的events—sqlalchemy.events.PoolEvents

负责db connection pool的生命周期事件管理,可以通过Pool或者Pool实例来注册事件,还可以使用Engine或Engine实例来注册Pool事件(通过engine.pool获得pool实例)。注册时,主要有两个参数:

PoolEvents中有以下这些事件:

其他Core Events

此处着重介绍PoolEvents,还有其他的Core Events,如下:

sqlalchemy中的ORM Events介绍

Attribute Events — sqlalchemy.orm.events.AttributeEvents

负责model属性相关的事件处理

Mapper Events — sqlalchemy.orm.events.MapperEvents

负责跟ORM model操作相关的事件处理

Instance Events—sqlalchemy.orm.events.InstanceEvents

负责model 实例的事件处理,Instance和Mapper事件类似,但Instance事件更关注model instance的生命周期,而Mapper更关注model持久化系统的事件。

Session Events—sqlalchemy.orm.events.SessionEvents

负责db Session的事件处理

TaibiaoGuo commented 5 years ago

Flask_sqlalchemy 是对sqlalchemy的封装,请问如果我的Flask_sqlalchemy的情况下如何使用sqlalchemy的功能。例如我想使用sqlalchemy的执行原始SQL语句的功能,但Flask_sqlalchemy 未提供。