<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        使用Python的web.py框架實現類似Django的ORM查詢的教程

        來源:懂視網 責編:小采 時間:2020-11-27 14:41:46
        文檔

        使用Python的web.py框架實現類似Django的ORM查詢的教程

        使用Python的web.py框架實現類似Django的ORM查詢的教程:Django中的對象查詢 Django框架自帶了ORM,實現了一些比較強大而且方便的查詢功能,這些功能和表無關。比如下面這個例子: class Question(models.Model): question_text = models.CharField(max_length=200) pub_date
        推薦度:
        導讀使用Python的web.py框架實現類似Django的ORM查詢的教程:Django中的對象查詢 Django框架自帶了ORM,實現了一些比較強大而且方便的查詢功能,這些功能和表無關。比如下面這個例子: class Question(models.Model): question_text = models.CharField(max_length=200) pub_date

        Django中的對象查詢

        Django框架自帶了ORM,實現了一些比較強大而且方便的查詢功能,這些功能和表無關。比如下面這個例子:

        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.all和objects.get這些功能都不是在class Question中定義的,可能在其父類models.Model中定義,也可能不是。那么我們在web.py中如何實現這樣的功能呢?(如果你選擇使用SQLAlchemy就不需要自己實現了)。
        實現
        思路

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

      1. 需要實現一個模型的父類Model,實際的表可以從這個父類繼承以獲得自己沒有定義的功能。
      2. 實際的模型類(比如Question類)定義后,不實例話的情況下就要具備objects.all()這樣的查詢效果。
      3. 從上面的需求可以看出,我們需要在類定義的時候就實現這些功能,而不是等到類實例化的時候再實現這些功能。類定義的時候實現功能?這不就是metaclass(元類)做的事情嘛。因此實現過程大概是下面這樣的:
      4. 實現一個Model類,其綁定方法和表的增、刪、改有關。
      5. 修改Model類的元類為ModelMetaClass,該元類定義的過程中為類增加一個objects對象,該對象是一個ModelDefaultManager類的實例,實現了表的查詢功能。
      6. 代碼

        都說不給代碼就是耍流氓,我還是給吧。說明下:使用的數據庫操作都是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))
        
        

        使用

        首先定義表對應的類:

        class Users(Model):
         ...
        
        

        使用就和Django的方式一樣:

        >>> user_list = Users.objects.all()
        
        

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        使用Python的web.py框架實現類似Django的ORM查詢的教程

        使用Python的web.py框架實現類似Django的ORM查詢的教程:Django中的對象查詢 Django框架自帶了ORM,實現了一些比較強大而且方便的查詢功能,這些功能和表無關。比如下面這個例子: class Question(models.Model): question_text = models.CharField(max_length=200) pub_date
        推薦度:
        標簽: 查詢 實現 python
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久精品国产这里是免费| 久久国产精品一区免费下载| 大地资源二在线观看免费高清 | 亚洲国产精品尤物yw在线| 亚洲国产成人久久精品软件| aa级一级天堂片免费观看| 亚洲AV无码专区在线亚| 成年人视频在线观看免费| 国产免费爽爽视频在线观看| 亚洲美女又黄又爽在线观看| 成人精品视频99在线观看免费| 亚洲国产成人片在线观看无码| 亚洲精品无码久久久久APP| 日韩电影免费在线| 一级毛片完整版免费播放一区| 日韩一卡2卡3卡4卡新区亚洲| 日本道免费精品一区二区| 亚洲欧洲日韩不卡| 久久久高清免费视频| 国产天堂亚洲国产碰碰| 国产亚洲av片在线观看18女人 | 精品熟女少妇aⅴ免费久久| 亚洲熟妇中文字幕五十中出| 99热在线免费播放| 国产成人精品亚洲2020| 免费一级毛片不卡不收费| 日本免费污片中国特一级| 亚洲一区二区三区久久久久| 全部免费毛片在线| 色猫咪免费人成网站在线观看| 中文字幕 亚洲 有码 在线| 亚洲国产婷婷综合在线精品| 久久久久久成人毛片免费看| 亚洲熟女精品中文字幕| 在线a亚洲v天堂网2019无码| 国产在线jyzzjyzz免费麻豆| 亚洲视频在线观看不卡| 国产精品免费电影| 免费国产黄网站在线观看| 精品国产亚洲一区二区三区在线观看| 国产亚洲日韩一区二区三区|