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'<h1>Hello world!</h1>', 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值