婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 如何使用Python實現一個簡易的ORM模型

如何使用Python實現一個簡易的ORM模型

熱門標簽:廣告地圖標注app 陜西金融外呼系統 公司電話機器人 哈爾濱ai外呼系統定制 激戰2地圖標注 唐山智能外呼系統一般多少錢 海南400電話如何申請 白銀外呼系統 騰訊外呼線路

本文記錄下自己使用Python實現一個簡易的ORM模型

使用到的知識

1、元類

2、描述器

元類

對于元類,我的理解其實也便較淺,大概是這個意思

所有的類都是使用元類來進行創建的,而所有的類的父類中必然是object(針對Python3),Python中的元類只有一個(type),當然這里不包含自定義元類

下面我們來看下類的創建

class Test:   # 定義一個類
    pass

Test1 = type("Test2",(object,),{"name":"test"})  # 定義一個類


print(type(Test))
print(type(Test1))-----------------------
class 'type'>class 'type'>

從上面可以看出創建類,其實是有兩種方式,一種是通過class關鍵字來定義,一種是通過type來進行創建,當然常用的是使用class來進行創建了,在看最后的結果,可以看出類的類型為type。說明我們這個類就是由type來創建的

明白了這個之后我們再來梳理下怎么使用自定義元類來創建類,明白一點,自定義元類需要繼承type

class MetaClass(type):  # 定義一個元類
    pass


class Test(metaclass=MetaClass):  # 使用自定義元類來創建類
    pass



print(type(Test))


--------------------------

class '__main__.MetaClass'>

很明顯可以看出Test類就是用MetaClass類創建出來的

描述器

從描述器的定義來說,只要一個類中實現了__get__、__set__、__delete__中的一個或幾個,這個類的實例就可以叫描述器

下面我們來定義一個簡易的描述器

class Describer:

    def __set__(self, instance, value):
        print("設置屬性的時候會被調用")
        self.value = value

    def __get__(self, instance, owner):
        print("獲取屬性的時候會被調用")
        return self.value

    def __delete__(self, instance):
        print("刪除屬性的時候會被調用")
        self.value = None


class Test:
    name = Describer()



t = Test()
t.name = "xxxxx"
print(t.name)

----------------------

設置屬性的時候會被調用
獲取屬性的時候會被調用
xxxxx

從上面的代碼中有沒有什么想法?既然__set__方法會在我們設置屬性的時候會被調用,那么我們是不是可以在設置屬性前對這個屬性做一些操作呢?

ORM模型

ORM模型到底是個啥?ORM對于后端研發來說肯定是不陌生的,包括很多后端框架現在都自帶這個模型了

ORM(Object Relational Mapping)對象關系映射

既然是對象關系映射,那對象是啥?我的理解為:Python中的類與數據庫之間的映射,對數據的操作就不用編寫SQL語言了,因為都封裝好了,比如你想插入一條數據,你就直接創建一個對象即可,

Python ------->>>>      數據庫

類名     ------->>>>      數據庫中的表名

對象     ------->>>>      數據庫中的一行數據

屬性     ------->>>>      數據庫中的字段

大致就是上面的映射關系

ORM實現步驟

1、利用描述器實現對數據庫字段的類型、長度限制

2、實現Mode類,也就是Python中的類

3、利用元類實現映射關系

好,我們先利用描述器來實現對數據字段的類型,長度限制

class BaseFiled:
    pass


class CharFiled(BaseFiled):
    """定義一個字符串的類型限制"""

    def __init__(self, length=10):
        self.length = length

    def __set__(self, instance, value):
        if isinstance(value, str):
            if len(value) = self.length:
                self.value = value
            else:
                raise ValueError("length can not exceed {}".format(self.length))
        else:
            raise TypeError("need a str")

    def __get__(self, instance, owner):
        return self.value

    def __delete__(self, instance):
        self.value = None


class IntFiled(BaseFiled):
    """定義一個數值的類型限制"""

    def __set__(self, instance, value):
        if isinstance(value, int):

            self.value = value
        else:
            raise TypeError("need a int")

    def __get__(self, instance, owner):
        return self.value

    def __delete__(self, instance):
        self.value = None


class BoolFiled(BaseFiled):
    """定義一個布爾的類型限制"""
    def __set__(self, instance, value):
        if isinstance(value, bool):

            self.value = value
        else:
            raise TypeError("need a bool")

    def __get__(self, instance, owner):
        return self.value

    def __delete__(self, instance):
        self.value = None

上面實現了三種,分別是字符串、數值、布爾值的,下面在來實現元類以及模型類

class MyMateClass(type):
    """自定義一個元類"""
    def __new__(cls, name: str, bases: tuple, dic: dict, *args, **kwargs):
        """

        :param name: name為模型類的類名也就是數據庫中的表名
        :param bases:  bases為一個元祖類型,里面裝的是name這個類的父類
        :param dic: dic為一個dict類型,裝的是name這個類中的屬性
        :param args:
        :param kwargs:
        :return:
        """
        if name == "BaseMode":   # 判斷類名是否為BaseMode,如果是則直接使用元類創建類,不做其他任何操作
            return super().__new__(cls, name, bases, dic)
        else:
            table_name = name.lower()  # 將表名變成小寫
            filed_dic = {}   # 定義一個空的列表,用來裝dic中屬于BaseFiled類型的屬性,因為dic中會有其他創建類時自動生成的屬性,這些屬性我們沒必要去建立映射關系,所以需要將其剔除掉
            for k, v in dic.items():
                if isinstance(v, BaseFiled):
                    filed_dic[k] = v
            dic["t_name"] = table_name    # 將表名添加到dic中,實現類名與表名的映射關系
            dic["filed_dict"] = filed_dic  # 將屬于BaseFiled類型的屬性給添加到dic中,實現屬性與字段的映射關系
            return super().__new__(cls, name, bases, dic)


class BaseMode(metaclass=MyMateClass):

    def __init__(self, **kwargs):
        """
        由于每一個模型類(也就是數據庫表)的屬性個數不一致,所以我們需要定義一個父類來進行定義初始化的屬性
        :param kwargs:
        """
        for k, v in kwargs.items():   # 遍歷傳進來的所有屬性
            setattr(self, k, v)   # 拿到這些屬性后對self(也就是類本身)進行設置屬性

    def save(self):
        """生成SQL語句"""
        # 獲取表名
        table_name = self.t_name
        # 獲取所有的屬性
        fileds = self.filed_dict
        dic = {}  # 定義一個空字典,用來裝屬性名和屬性值
        for k, v in fileds.items():
            value = getattr(self, k)
            dic[k] = value
        sql = "insert into {} values{}".format(table_name, tuple(dic.values()))
        return sql


class User(BaseMode):
    name = CharFiled()
    age = IntFiled()
    love = CharFiled(length=50)
    live = BoolFiled()


if __name__ == '__main__':
    c = User(name="lc", age=12, love="hjh", live=True)
    c.save()




--------------------------
insert into user values('lc', 12, 'hjh', True)

以上就實現了一個簡單的ORM模型了,這個雖然在測試開發過程中用的很少(一般都是直接用框架中封裝好的),學習這個也是為了更好的理解原理,后面好學習flask以及Django。

下面貼一下完整的代碼吧

# -*- coding: utf-8 -*-
# @Time    : 2021-05-11 10:14
# @Author  : cainiao
# @File    : Meat.py
# @Software: PyCharm
# @Content : 實現ORM模型

class BaseFiled:
    pass


class CharFiled(BaseFiled):
    """定義一個字符串的類型限制"""

    def __init__(self, length=10):
        self.length = length

    def __set__(self, instance, value):
        if isinstance(value, str):
            if len(value) = self.length:
                self.value = value
            else:
                raise ValueError("length can not exceed {}".format(self.length))
        else:
            raise TypeError("need a str")

    def __get__(self, instance, owner):
        return self.value

    def __delete__(self, instance):
        self.value = None


class IntFiled(BaseFiled):
    """定義一個數值的類型限制"""

    def __set__(self, instance, value):
        if isinstance(value, int):

            self.value = value
        else:
            raise TypeError("need a int")

    def __get__(self, instance, owner):
        return self.value

    def __delete__(self, instance):
        self.value = None


class BoolFiled(BaseFiled):
    """定義一個數值的類型限制"""

    def __set__(self, instance, value):
        if isinstance(value, bool):

            self.value = value
        else:
            raise TypeError("need a bool")

    def __get__(self, instance, owner):
        return self.value

    def __delete__(self, instance):
        self.value = None


class MyMateClass(type):
    """自定義一個元類"""
    def __new__(cls, name: str, bases: tuple, dic: dict, *args, **kwargs):
        """

        :param name: name為模型類的類名也就是數據庫中的表名
        :param bases:  bases為一個元祖類型,里面裝的是name這個類的父類
        :param dic: dic為一個dict類型,裝的是name這個類中的屬性
        :param args:
        :param kwargs:
        :return:
        """
        if name == "BaseMode":   # 判斷類名是否為BaseMode,如果是則直接使用元類創建類,不做其他任何操作
            return super().__new__(cls, name, bases, dic)
        else:
            table_name = name.lower()  # 將表名變成小寫
            filed_dic = {}   # 定義一個空的列表,用來裝dic中屬于BaseFiled類型的屬性,因為dic中會有其他創建類時自動生成的屬性,這些屬性我們沒必要去建立映射關系,所以需要將其剔除掉
            for k, v in dic.items():
                if isinstance(v, BaseFiled):
                    filed_dic[k] = v
            dic["t_name"] = table_name    # 將表名添加到dic中,實現類名與表名的映射關系
            dic["filed_dict"] = filed_dic  # 將屬于BaseFiled類型的屬性給添加到dic中,實現屬性與字段的映射關系
            return super().__new__(cls, name, bases, dic)


class BaseMode(metaclass=MyMateClass):

    def __init__(self, **kwargs):
        """
        由于每一個模型類(也就是數據庫表)的屬性個數不一致,所以我們需要定義一個父類來進行定義初始化的屬性
        :param kwargs:
        """
        for k, v in kwargs.items():   # 遍歷傳進來的所有屬性
            setattr(self, k, v)   # 拿到這些屬性后對self(也就是類本身)進行設置屬性

    def save(self):
        """生成SQL語句"""
        # 獲取表名
        table_name = self.t_name
        # 獲取所有的屬性
        fileds = self.filed_dict
        dic = {}  # 定義一個空字典,用來裝屬性名和屬性值
        for k, v in fileds.items():
            value = getattr(self, k)
            dic[k] = value
        sql = "insert into {} values{}".format(table_name, tuple(dic.values()))
        return sql


class User(BaseMode):
    name = CharFiled()
    age = IntFiled()
    love = CharFiled(length=50)
    live = BoolFiled()


if __name__ == '__main__':
    c = User(name="lc", age=12, love="hjh", live=True)
    print(c.save())
    # c.name="lc"
    # print(c.name)

以上就是如何使用Python實現一個簡易的ORM模型的詳細內容,更多關于python 實現ORM模型的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Python Django ORM連表正反操作技巧
  • 用 Python 元類的特性實現 ORM 框架
  • python 實現format進制轉換與刪除進制前綴
  • Python3+SQLAlchemy+Sqlite3實現ORM教程
  • Python的輕量級ORM框架peewee使用教程
  • Python通過format函數格式化顯示值
  • python利用platform模塊獲取系統信息
  • Python colormap庫的安裝和使用詳情
  • python中format函數如何使用
  • Python自定義聚合函數merge與transform區別詳解
  • python orm 框架中sqlalchemy用法實例詳解
  • python用sqlacodegen根據已有數據庫(表)結構生成對應SQLAlchemy模型

標簽:惠州 鷹潭 黑龍江 黔西 常德 四川 益陽 上海

巨人網絡通訊聲明:本文標題《如何使用Python實現一個簡易的ORM模型》,本文關鍵詞  如何,使用,Python,實現,一個,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何使用Python實現一個簡易的ORM模型》相關的同類信息!
  • 本頁收集關于如何使用Python實現一個簡易的ORM模型的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    天天色天天爱天天射综合| 91欧美激情一区二区三区成人| 国产精品一区免费视频| 欧美美女视频在线观看| 久久综合视频网| 日韩精品一卡二卡三卡四卡无卡| 91一区二区三区在线观看| 精品999在线播放| 亚洲综合在线免费观看| caoporm超碰国产精品| 亚洲国产经典视频| 日韩国产精品久久久| 调教+趴+乳夹+国产+精品| 99精品视频在线观看| 欧美在线观看一二区| 国产日韩精品视频一区| 日韩视频一区二区三区| 日本va欧美va欧美va精品| 久草中文综合在线| 毛片一区二区三区| 国产精一品亚洲二区在线视频| 成人伦理片在线| 国产亚洲欧美日韩日本| 国产一区二区电影| 欧美一级精品大片| 日本视频一区二区三区| 丝袜美腿亚洲一区| 亚洲国产色一区| 亚洲成人午夜影院| 免费成人结看片| 麻豆国产欧美一区二区三区| 一区二区三区久久久| 欧美综合视频在线观看| 久久精品人人做人人爽人人| 日韩毛片在线免费观看| 久久久久久麻豆| 一区在线播放视频| 国产三级精品视频| 欧美中文字幕一区| 一区在线中文字幕| 国产成人一区在线| 久久激情五月激情| 7777女厕盗摄久久久| 精品久久99ma| 中文字幕欧美日本乱码一线二线| 日本午夜一区二区| 日韩美女在线视频| 日本vs亚洲vs韩国一区三区二区| 久久久久久久久久久久久夜| 国产精品99久| 久久久亚洲综合| 7777精品伊人久久久大香线蕉完整版 | 首页综合国产亚洲丝袜| 最新不卡av在线| 一本大道久久a久久综合| 中文字幕中文字幕中文字幕亚洲无线| 精品第一国产综合精品aⅴ| 99re成人精品视频| 久久99精品久久只有精品| 亚洲综合男人的天堂| 久久精品视频在线看| 精品福利av导航| 国产三级三级三级精品8ⅰ区| 国产亚洲欧洲一区高清在线观看| 欧美精品久久天天躁| 国产电影一区二区三区| 亚洲第一在线综合网站| 精品久久久久久综合日本欧美| 在线视频欧美区| 日韩欧美国产1| 日韩免费高清av| 九九九久久久精品| 亚洲一区二区3| 国产精品美女久久久久久2018| 欧美激情中文不卡| 久久99国产精品久久99果冻传媒| 国产成人午夜高潮毛片| 99久久综合色| 国产美女av一区二区三区| 日韩中文字幕麻豆| 亚洲三级在线看| 国产精品天干天干在线综合| 欧美变态tickling挠脚心| 欧美精品在线观看一区二区| 99在线精品视频| jlzzjlzz亚洲女人18| 国产成人鲁色资源国产91色综| 国产在线国偷精品产拍免费yy| 久久影音资源网| 欧美一区午夜视频在线观看| 国产午夜久久久久| 欧美色倩网站大全免费| 欧美另类变人与禽xxxxx| 国产91色综合久久免费分享| 午夜国产精品一区| 国产激情精品久久久第一区二区| 亚洲精品五月天| 热久久免费视频| 高清日韩电视剧大全免费| 99re热这里只有精品视频| 欧美日韩精品欧美日韩精品| 欧美成人官网二区| 《视频一区视频二区| 欧美变态tickling挠脚心| 六月丁香婷婷色狠狠久久| 综合久久综合久久| 亚洲色欲色欲www| **欧美大码日韩| 久久久久九九视频| 久久综合色天天久久综合图片| 欧美一级黄色录像| 精品福利在线导航| 欧美国产1区2区| 亚洲一二三四在线| 日韩激情一区二区| 激情文学综合插| 97se亚洲国产综合自在线观| 欧美在线视频不卡| 2023国产精品视频| 一区二区日韩电影| 久久福利资源站| 在线影视一区二区三区| 日韩一区二区三区免费看| 亚洲国产精华液网站w| 亚洲成人自拍网| 国产精品99久久久久久似苏梦涵 | 成人高清免费观看| 亚洲激情第一区| 青青草成人在线观看| 成人网在线播放| 欧美大片在线观看一区| 亚洲黄网站在线观看| 国产在线不卡视频| 欧美高清视频不卡网| 中文字幕第一区综合| 激情综合色综合久久综合| 欧美日韩一级视频| 亚洲欧美aⅴ...| 99久久久国产精品免费蜜臀| 精品久久国产老人久久综合| 丝袜诱惑制服诱惑色一区在线观看| 粉嫩aⅴ一区二区三区四区五区 | 欧美日韩久久不卡| 中文一区在线播放| 高清成人免费视频| 国产欧美日韩三区| 国产很黄免费观看久久| 欧美高清在线一区二区| 国产成人精品一区二区三区网站观看| 欧美大片一区二区三区| 久久99精品国产.久久久久久| 日韩精品一区二区三区四区视频| 日韩av不卡一区二区| 欧美一区二区三区免费视频| 日韩综合一区二区| 久久九九久精品国产免费直播| 国产精品一区免费视频| 国产精品视频一二三区| 色综合一个色综合亚洲| 亚洲欧美激情插| 日韩欧美在线123| 播五月开心婷婷综合| 亚洲国产另类av| 91精品欧美久久久久久动漫| 国产一区日韩二区欧美三区| 国产一区二区精品久久| 亚洲女女做受ⅹxx高潮| 国产亚洲一区二区三区在线观看| 一本到不卡精品视频在线观看 | 午夜av一区二区| 久久欧美一区二区| 91久久人澡人人添人人爽欧美| 日韩精品一级二级| 国产91在线观看丝袜| 五月激情综合色| 欧美激情在线看| 日韩一区二区免费在线观看| 成人在线视频首页| 日韩中文欧美在线| 国产日产欧美一区二区视频| 欧美高清视频www夜色资源网| 成人精品小蝌蚪| 精品一区二区久久久| 日韩精品福利网| 亚洲成人免费在线| 亚洲黄色性网站| 亚洲精品免费电影| 777xxx欧美| 欧美日本不卡视频| 91黄色在线观看| 在线影院国内精品| 日本韩国精品一区二区在线观看| 成人午夜免费电影| 国产夫妻精品视频| 懂色av中文字幕一区二区三区| 九九精品视频在线看| 国产黑丝在线一区二区三区| 国产乱对白刺激视频不卡| 国产精品白丝jk黑袜喷水| 国产一区二区三区久久久|