Python学习笔记(28),廖雪峰教程编写ORM和Model的总结

Python Web实战总结(1)

搭建开发环境

使用Python版本3.7,异步框架aiohttp,前端模板引擎jinja2,MySQL的Python异步驱动程序aiomysql

编写Web App骨架

我们的Web App建立在asyncio的基础上,因此用aiohttp写一个基本的app.py,参照aiohttp的官方文档:

from aiohttp import web


async def hello(request):
    return web.Response(body=b'

Hello world!

'
, content_type='text/html') app = web.Application() app.add_routes([web.get('/', hello)]) web.run_app(app, host='127.0.0.1', port=8080)

async表示异步协程,await表示yield from

ORM编写

ORM全称是Object-Relational Mapping,也就是把数据库中的数据于程序中的对象Object直接联系起来,这样做的好处是可以把操作数据库的SQL语句封装,直接操作object就可以达到操作数据库的目的。

在Python中,要实现ORM需要用到元类型,也就是Metaclass。所谓的metaclass就是定义类的类,参考type和metaclass

为了创建ORM,我们需要做到的是动态地创建类的参数。其运行流程步骤如下:

  1. 用户定义好数据库表对应的类的属性,例如一个User类包含有id, email, passwd, ...,这些属性对应为StringField, IntegerField, bool, FloatField等。
  2. 在创建User类时,会先创建其父类Model,父类中指定metaclass=ModelMetaclass,调用ModelMetaclass.__new__(cls, name, bases, attrs)
  3. attrs中包含有User类中定义的各种属性,在ModelMetaclass.__new__方法中,检测这些属性是否对应为数据库里的列(是Field类的实例),如果是,就保存属性与列的映射关系,同时在类中添加一些参数,例如__table__表名,__select____insert__等SQL语句的写法。这些SQL语句根据attrs中的属性而创建的。
  4. Model类中,定义findAllsaveupdateremove等函数,这些函数中可以用到Metaclass中提供的SQL语句。这样做的好处是不用为数据库中的每一个表都写对应的SQL语句来实现CRUD操作。

其他注意事项:

  • MySQL语句中使用?,在Python中使用%s
  • SQL语句中,为了保证安全性,在数据库表中的每一列的列名都加上“`”。
  • 连接池的创建。
  • 如果有SQL语句中有where, order by等,把这些内容附加在__select__后即可。

详细的Code参考day-4

你可能感兴趣的:(Python)