浅谈python web框架中的orm设计

看了一下廖雪峰的那个web框架,其实就是封装了web.py,请求使用异步并将aiomysql做为MySQL数据库提供了异步IO的驱动,前端部分则整合了jinja.其中最难的应该是orm部分了。

下面是orm一个简单的例子。

class User(Model):
    __table__ = ‘users‘

    id = StringField(primary_key=True, default=next_id, ddl=‘varchar(50)‘)
    email = StringField(ddl=‘varchar(50)‘)
    passwd = StringField(ddl=‘varchar(50)‘)
    admin = BooleanField()
    name = StringField(ddl=‘varchar(50)‘)
    image = StringField(ddl=‘varchar(500)‘)
    created_at = FloatField(default=time.time)

整体来看这是一个为User的简单table,集成了Model类。然后字段则是各种类型Field。

1.先来看看字段,也就是Field部分。Field部分比较简单,继承了object,然后初始化一些字段,其实没什么好说的。在字段赋值时,参数以dict格式传入,传入到哪里呢,本来type的dict是为none的,但下面这段代码用__new__改变了原来的type,而元类是创建类的类,因此,Field字段的参数,都会在ModelMetaclass类中做处理

class ModelMetaclass(type):

    def __new__(cls, name, bases, attrs):
        if name==‘Model‘:
            return type.__new__(cls, name, bases, attrs)
        tableName = attrs.get(‘__table__‘, None) or name
        logging.info(‘found model: %s (table: %s)‘ % (name, tableName))
        mappings = dict()
        fields = []
        primaryKey = None
        for k, v in attrs.items():
            if isinstance(v, Field):
                logging.info(‘  found mapping: %s ==> %s‘ % (k, v))
                mappings[k] = v
                if v.primary_key:
                    # 找到主键:
                    if primaryKey:
                        raise StandardError(‘Duplicate primary key for field: %s‘ % k)
                    primaryKey = k
                else:
                    fields.append(k)
        if not primaryKey:
            raise StandardError(‘Primary key not found.‘)
        for k in mappings.keys():
            attrs.pop(k)
        escaped_fields = list(map(lambda f: ‘`%s`‘ % f, fields))
        attrs[‘__mappings__‘] = mappings # 保存属性和列的映射关系
        attrs[‘__table__‘] = tableName
        attrs[‘__primary_key__‘] = primaryKey # 主键属性名
        attrs[‘__fields__‘] = fields # 除主键外的属性名
        attrs[‘__select__‘] = ‘select `%s`, %s from `%s`‘ % (primaryKey, ‘, ‘.join(escaped_fields), tableName)
        attrs[‘__insert__‘] = ‘insert into `%s` (%s, `%s`) values (%s)‘ % (tableName, ‘, ‘.join(escaped_fields), primaryKey, create_args_string(len(escaped_fields) + 1))
        attrs[‘__update__‘] = ‘update `%s` set %s where `%s`=?‘ % (tableName, ‘, ‘.join(map(lambda f: ‘`%s`=?‘ % (mappings.get(f).name or f), fields)), primaryKey)
        attrs[‘__delete__‘] = ‘delete from `%s` where `%s`=?‘ % (tableName, primaryKey)
        return type.__new__(cls, name, bases, attrs)

而Model类相对简单,主要是为了初始化了get/set以及几个getvalue的函数,这一块根据自己需要看看就好。

class Model(dict, metaclass=ModelMetaclass):

    def __init__(self, **kw):
        super(Model, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"‘Model‘ object has no attribute ‘%s‘" % key)

    def __setattr__(self, key, value):
        self[key] = value

    def getValue(self, key):
        return getattr(self, key, None)

    def getValueOrDefault(self, key):
        value = getattr(self, key, None)
        if value is None:
            field = self.__mappings__[key]
            if field.default is not None:
                value = field.default() if callable(field.default) else field.default
                logging.debug(‘using default value for %s: %s‘ % (key, str(value)))
                setattr(self, key, value)
        return value

    @classmethod
    @asyncio.coroutine
    def findNumber(cls, selectField, where=None, args=None):
        ‘ find number by select and where. ‘
        sql = [‘select %s _num_ from `%s`‘ % (selectField, cls.__table__)]
        if where:
            sql.append(‘where‘)
            sql.append(where)
        rs = yield from select(‘ ‘.join(sql), args, 1)
        if len(rs) == 0:
            return None
        return rs[0][‘_num_‘]

....

@classmethod是为了将方法变成类方法,@asyncio.coroutine则是为了做异步处理。

时间: 2024-10-20 03:47:58

浅谈python web框架中的orm设计的相关文章

浅谈Python web框架

一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: 官网相关的链接:http://wiki.python.org/moin/WebFrameworks 虽然另一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是因为Python Web Framework(Python Web开发框架,以下简称Python框架)太多,所以在P

浅谈Python Web的五大框架

说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界.各种micro-framework.framework不可胜数. 尽管还有一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是由于Python Web Framework(Python Web开发框架,以下简称Python框架)太多.所以在Python社区总有关于Python框架孰优孰劣的话题,讨论的时间跨度甚至长达3-5年. Python这么多框架,能挨个玩个遍的人不多,坦白

浅谈Python Django框架

1.Django简介 Python下有多款不同的 Web 框架,Django是最有代表性的一种.许多成功的网站和APP都基于Django. Django是一个开源的Web应用框架,由Python写成. Django采用了MVC的软件设计模式,即模型M,视图V和控制器C.   2.Django的特点 1) 强大的数据库功能:用python的类继承,几行代码就可以拥有一个动态的数据库操作API,如果需要也能执行SQL语句. 2) 自带的强大的后台功能:几行代码就让网站拥有一个强大的后台,轻松管理内容

浅谈java web开发中的乱码问题的解决

直接上在工作中遇到的问题吧: 在springmvc的项目中 前台表单通过get请求发送的中文在后台接收后出现乱码 于是我配置了一个spring的过滤器 org.springframework.web.filter.CharacterEncodingFilter 但是仅仅处理了post请求的中文乱码问题,网上说有一种简单的方法就是修改tomcat的server.xml文件,但是这个方法也太部靠谱了吧,还是另想他发吧! 于是我就着手写一个Filter去处理乱码问题 通过包装 javax.servle

浅谈五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058 导读:作者飞龙写了一篇<浅谈Python Web框架>,文中他介绍了几个Python Web框架和自己对选择框架的分析.在他看来,用Django来快速开发一些Web运用是很不错的选择.以下是文章内容: 说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: http://wik

python web框架分析和学习篇_彭友

分析篇: 刚好到网上搜到了一篇<浅谈Python web框架>,里面系统的分析了五种主流的Python框架,现在python的主流框架有Django.Pylons&TurboGears&repose.bfg.Tornado&web.py&Bottle&Flask和Quixote.它从宏观角度分析了这五种框架的优劣,看完之后我们决定选择Django,因为: Django: 概述:可谓是python框架里面最大的一家,它是里面文档最完善.市场占有率最高.招聘

微型 Python Web 框架: Bottle

微型 Python Web 框架: Bottle 在 19/09/11 07:04 PM 由 COSTONY 发表 Bottle 是一个非常小巧但高效的微型 Python Web 框架,它被设计为仅仅只有一个文件的Python模块,并且除Python标准库外,它不依赖于任何第三方模块. 路由(Routing):将请求映射到函数,可以创建十分优雅的 URL 模板(Templates):Pythonic 并且快速的 Python 内置模板引擎,同时还支持 mako, jinja2, cheetah

Python Web框架Tornado的异步处理代码示例

1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与另一个流行的Python web框架Django相比,tornado不提供操作数据库的ORM接口及严格的MVC开发模式,但可以提供基本的web server功能,故它是轻量级的:它借助non-blocking and event-driven的I/O模型(epoll或kqueue)实现了一套异步网络库,故它是高性能的. Tornado的轻量级+高性能特性使得它特别适用于提供web api的场合,

Python Web框架Tornado的异步处理代码演示样例

1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口及严格的MVC开发模式,但能够提供主要的web server功能.故它是轻量级的:它借助non-blocking and event-driven的I/O模型(epoll或kqueue)实现了一套异步网络库,故它是高性能的. Tornado的轻量级+高性能特性使得它特别适用于提供web api的场合