亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

web.py中實(shí)現(xiàn)類似Django中的ORM的查詢效果

bladefury / 1816人閱讀

摘要:中的對(duì)象查詢框架自帶了,實(shí)現(xiàn)了一些比較強(qiáng)大而且方便的查詢功能,這些功能和表無關(guān)。實(shí)際的模型類比如類定義后,不實(shí)例話的情況下就要具備這樣的查詢效果。

Django中的對(duì)象查詢

Django框架自帶了ORM,實(shí)現(xiàn)了一些比較強(qiáng)大而且方便的查詢功能,這些功能和表無關(guān)。比如下面這個(gè)例子:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("date published")
    
    

Question.objects.all()
Question.objects.get(pk=1)

從例子可以看出,objects.allobjects.get這些功能都不是在class Question中定義的,可能在其父類models.Model中定義,也可能不是。那么我們?cè)?strong>web.py中如何實(shí)現(xiàn)這樣的功能呢?(如果你選擇使用SQLAlchemy就不需要自己實(shí)現(xiàn)了)。

實(shí)現(xiàn) 思路

我們注意到Question.objects.all()這樣的調(diào)用是直接訪問了類屬性objects,并調(diào)用了objects屬性的方法all()。這里objects可能是一個(gè)實(shí)例,也可能是一個(gè)類。我個(gè)人認(rèn)為(我沒看過Django的實(shí)現(xiàn))這應(yīng)該是一個(gè)實(shí)例,因?yàn)閷?shí)例化的過程可以傳遞一些表的信息,使得類似all()這樣的函數(shù)可以工作。經(jīng)過分析之后,我們可以列出我們需要解決的問題:

需要實(shí)現(xiàn)一個(gè)模型的父類Model,實(shí)際的表可以從這個(gè)父類繼承以獲得自己沒有定義的功能。

實(shí)際的模型類(比如Question類)定義后,不實(shí)例話的情況下就要具備objects.all()這樣的查詢效果。

從上面的需求可以看出,我們需要在類定義的時(shí)候就實(shí)現(xiàn)這些功能,而不是等到類實(shí)例化的時(shí)候再實(shí)現(xiàn)這些功能。類定義的時(shí)候?qū)崿F(xiàn)功能?這不就是metaclass(元類)做的事情嘛。因此實(shí)現(xiàn)過程大概是下面這樣的:

實(shí)現(xiàn)一個(gè)Model類,其綁定方法和表的增、刪、改有關(guān)。

修改Model類的元類為ModelMetaClass,該元類定義的過程中為類增加一個(gè)objects對(duì)象,該對(duì)象是一個(gè)ModelDefaultManager類的實(shí)例,實(shí)現(xiàn)了表的查詢功能。

代碼

都說不給代碼就是耍流氓,我還是給吧。說明下:使用的數(shù)據(jù)庫操作都是web.py的db庫中的接口。

    # -*- coding: utf-8 -*-
    
    import web
    
    import config  # 自定義的配置類,可以忽略
    
    
    def _connect_to_db():
        return web.database(dbn="sqlite", db=config.dbname)
    
    
    def init_db():
        db = _connect_to_db()
        for statement in config.sql_statements:
            db.query(statement)
    
    
    class ModelError(Exception):
        """Exception raised by all models.
    
        Attributes:
            msg: Error message.
        """
    
        def __init__(self, msg=""):
            self.msg = msg
    
        def __str__(self):
            return "ModelError: %s" % self.msg
    
    
    class ModelDefaultManager(object):
        """ModelManager implements query functions against a model.
    
        Attributes:
            cls: The class to be managed.
        """
    
        def __init__(self, cls):
            self.cls = cls
            self._table_name = cls.__name__.lower()
    
        def all(self):
            db = _connect_to_db()
            results = db.select(self._table_name)
            return [self.cls(x) for x in results]
    
        def get(self, query_vars, where):
            results = self.filter(query_vars, where, limit=1)
            if len(results) > 0:
                return results[0]
            else:
                return None
    
        def filter(self, query_vars, where, limit=None):
            db = _connect_to_db()
            try:
                results = db.select(self._table_name, vars=query_vars, where=where,
                                    limit=limit)
            except (Exception) as e:
                raise ModelError(str(e))
    
            return [self.cls(x) for x in results]
    
    
    class ModelMetaClass(type):
    
        def __new__(cls, classname, bases, attrs):
            new_class = super(ModelMetaClass, cls).__new__(cls, classname,
                                                           bases, attrs)
            objects = ModelDefaultManager(new_class)
            setattr(new_class, "objects", objects)
    
            return new_class
    
    
    class Model(object):
        """Parent class of all models.
        """
    
        __metaclass__ = ModelMetaClass
    
        def __init__(self):
            pass
    
        def _table_name(self):
            return self.__class__.__name__.lower()
    
        def insert(self, **kargs):
            db = _connect_to_db()
            try:
                with db.transaction():
                    db.insert(self._table_name(), **kargs)
            except (Exception) as e:
                raise ModelError(str(e))
    
        def delete(self, where, using=None, vars=None):
            db = _connect_to_db()
            try:
                with db.transaction():
                    db.delete(self._table_name(), where, vars=vars)
            except (Exception) as e:
                raise ModelError(str(e))
    
        def save(self, where, vars=None, **kargs):
            db = _connect_to_db()
            try:
                with db.transaction():
                    db.update(self._table_name(), where, vars, **kargs)
            except (Exception) as e:
                raise ModelError(str(e))
使用

首先定義表對(duì)應(yīng)的類:

class Users(Model):
    ...
    

使用就和Django的方式一樣:

user_list = Users.objects.all()

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/37497.html

相關(guān)文章

  • Lunar, 一個(gè)Python網(wǎng)絡(luò)框架實(shí)現(xiàn)

    摘要:核心的幾個(gè)組件模板引擎,框架,請(qǐng)求和應(yīng)答的處理還是有一些難度,但是經(jīng)過一步步的分析和編碼還是能夠完成功能。模板引擎模板引擎是另外一個(gè)比較大和的模塊。 前前后后,大概兩個(gè)月的時(shí)間,lunar這個(gè)項(xiàng)目終于達(dá)到了一個(gè)很高的完整度。 Lunar是一個(gè)Python語言的網(wǎng)絡(luò)框架,類似于Django,F(xiàn)lask,Tornado等當(dāng)下流行的web framework。最初有這個(gè)想法是在大二下學(xué)期,...

    邱勇 評(píng)論0 收藏0
  • Python_Django

    摘要:為了將代碼規(guī)范,約定俗成將視圖放置在項(xiàng)目或應(yīng)用程序目錄中命名為文件中。必須接受字段表示字符串長(zhǎng)度不能超過該值,默認(rèn)的標(biāo)簽最常用的。例,自動(dòng)添加發(fā)布時(shí)間。以字符串的形式存在,默認(rèn)最大長(zhǎng)度,可以通過參數(shù)設(shè)置。用于保存通用唯一識(shí)別碼的字段。 MVC 大部分開發(fā)語言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模塊之間的耦合性,方便變更,更容易重構(gòu)代碼,最大程度上實(shí)現(xiàn)代碼的重...

    BearyChat 評(píng)論0 收藏0
  • 通過demo學(xué)習(xí)OpenStack開發(fā)所需基礎(chǔ)知識(shí) -- 數(shù)據(jù)庫(1)

    摘要:另外,項(xiàng)目在單元測(cè)試中使用的是的內(nèi)存數(shù)據(jù)庫,這樣開發(fā)者運(yùn)行單元測(cè)試的時(shí)候不需要安裝和配置復(fù)雜的數(shù)據(jù)庫,只要安裝好就可以了。而且,數(shù)據(jù)庫是保存在內(nèi)存中的,會(huì)提高單元測(cè)試的速度。是實(shí)現(xiàn)層的基礎(chǔ)。項(xiàng)目一般會(huì)使用數(shù)據(jù)庫來運(yùn)行單元測(cè)試。 OpenStack中的關(guān)系型數(shù)據(jù)庫應(yīng)用 OpenStack中的數(shù)據(jù)庫應(yīng)用主要是關(guān)系型數(shù)據(jù)庫,主要使用的是MySQL數(shù)據(jù)庫。當(dāng)然也有一些NoSQL的應(yīng)用,比如Ce...

    warnerwu 評(píng)論0 收藏0
  • Awesome Python

    摘要:漢字拼音 Awesome Python A curated list of awesome Python frameworks, libraries and software. Inspired by awesome-php. Awesome Python Environment Management Package Management Package Repositorie...

    fizz 評(píng)論0 收藏0
  • 個(gè)人博客三|首頁后臺(tái)開發(fā)

    摘要:聲明本渣渣部分代碼參考自其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都有一個(gè)開源的精神,碼出來的代碼本身是希望更多的人用到,應(yīng)用到生產(chǎn)中。 聲明:本渣渣部分代碼參考自TendCode其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都...

    zorpan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<