日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:34日期:2022-06-19 18:44:35
目錄元類描述器

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

使用到的知識

1、元類

2、描述器

元類

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

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

下面我們來看下類的創建

class Test: # 定義一個類 passTest1 = type('Test2',(object,),{'name':'test'}) # 定義一個類print(type(Test))print(type(Test1))-----------------------<class ’type’><class ’type’>

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

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

class MetaClass(type): # 定義一個元類 passclass Test(metaclass=MetaClass): # 使用自定義元類來創建類 passprint(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 = Noneclass 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: passclass 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 = Noneclass IntFiled(BaseFiled): '''定義一個數值的類型限制''' def __set__(self, instance, value):if isinstance(value, int): self.value = valueelse: raise TypeError('need a int') def __get__(self, instance, owner):return self.value def __delete__(self, instance):self.value = Noneclass BoolFiled(BaseFiled): '''定義一個布爾的類型限制''' def __set__(self, instance, value):if isinstance(value, bool): self.value = valueelse: 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_dictdic = {} # 定義一個空字典,用來裝屬性名和屬性值for k, v in fileds.items(): value = getattr(self, k) dic[k] = valuesql = 'insert into {} values{}'.format(table_name, tuple(dic.values()))return sqlclass 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: passclass 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 = Noneclass IntFiled(BaseFiled): '''定義一個數值的類型限制''' def __set__(self, instance, value):if isinstance(value, int): self.value = valueelse: raise TypeError('need a int') def __get__(self, instance, owner):return self.value def __delete__(self, instance):self.value = Noneclass BoolFiled(BaseFiled): '''定義一個數值的類型限制''' def __set__(self, instance, value):if isinstance(value, bool): self.value = valueelse: raise TypeError('need a bool') def __get__(self, instance, owner):return self.value def __delete__(self, instance):self.value = Noneclass 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_dictdic = {} # 定義一個空字典,用來裝屬性名和屬性值for k, v in fileds.items(): value = getattr(self, k) dic[k] = valuesql = 'insert into {} values{}'.format(table_name, tuple(dic.values()))return sqlclass 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 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美女视频网站久久| 国产视频久久| 日韩一级欧洲| 精品一区免费| 99精品电影| 亚洲大片在线| 亚洲激情婷婷| 免费人成精品欧美精品| 亚洲精品欧美| 国产精品片aa在线观看| 精品亚洲a∨一区二区三区18| 国产精品一区亚洲| 国产精品久久亚洲不卡| 麻豆精品少妇| 精品日产乱码久久久久久仙踪林| 欧美韩一区二区| 久久99蜜桃| 国产精品jk白丝蜜臀av小说| 国产精品亚洲四区在线观看| 国产毛片精品久久| 免费看久久久| 久久九九精品| 久久福利影视| 日韩精品一区二区三区中文在线 | 麻豆精品久久久| 福利一区二区| 欧美日韩一二| 亚洲精品高潮| 久久超碰99| 精品网站999| 天堂√8在线中文| 亚洲精品小说| 欧美在线91| 91亚洲国产| 136国产福利精品导航网址| 免费人成网站在线观看欧美高清| 国产亚洲电影| 999国产精品| 婷婷精品在线| 91亚洲国产| 欧美综合国产| 欧美xxxx性| 久久视频精品| 欧美偷窥清纯综合图区| 精品九九久久| 免费一级片91| 精品亚洲二区| 午夜精品网站| 国产精品99精品一区二区三区∴| 偷拍精品精品一区二区三区| 亚洲有吗中文字幕| 国产激情久久| 欧美日韩视频一区二区三区| 国产日产一区| 欧美日韩国产高清电影| 人人爱人人干婷婷丁香亚洲| 日韩毛片视频| 日韩精品一区二区三区中文字幕| 国产在线一区不卡| 91成人精品| 国产美女撒尿一区二区| 久久五月天小说| 国产精品v日韩精品v欧美精品网站| 色爱av综合网| 日韩av一二三| 婷婷综合在线| 国产精品一卡| 香蕉久久夜色精品国产| 精品国内亚洲2022精品成人 | 都市激情国产精品| 伊人久久亚洲| www在线观看黄色| 亚洲三级观看| 色婷婷久久久| 国产精品主播在线观看| 一区免费视频| 国产成人精品999在线观看| 蜜臀91精品一区二区三区| 国语对白精品一区二区| 中文视频一区| 久久久久久久久久久妇女| 国产调教精品| 石原莉奈在线亚洲二区| 日韩深夜视频| 国产精品中文字幕亚洲欧美| 久久最新视频| 久久国产亚洲精品| 国产精品成人一区二区不卡| 亚洲欧美在线综合| 免费不卡中文字幕在线| 国产精品福利在线观看播放| 久久国产精品免费一区二区三区 | 国产伦理一区| 亚洲免费毛片| av成人国产| 不卡福利视频| 国产极品嫩模在线观看91精品| 综合视频一区| 一本一道久久a久久精品蜜桃| 美女毛片一区二区三区四区最新中文字幕亚洲 | 亚洲小说欧美另类婷婷| 六月丁香综合在线视频| 亚洲区欧美区| 合欧美一区二区三区| 成人av三级| 日本久久综合| 粉嫩av一区二区三区四区五区 | 中国女人久久久| 成人精品中文字幕| 日韩国产一区| 成午夜精品一区二区三区软件| 国产精品中文字幕制服诱惑| 综合在线一区| 亚洲欧美日本国产| 综合日韩在线| 亚洲精品进入| 五月亚洲婷婷 | av一区二区高清| 蜜臀国产一区| 国产盗摄——sm在线视频| 麻豆精品新av中文字幕| 国产精品115| 国产毛片精品| 狂野欧美性猛交xxxx| 精品五月天堂| 国产精品专区免费| 日韩欧美午夜| 午夜天堂精品久久久久| 亚洲永久av| av一区在线| 久久在线视频免费观看| 欧美日韩水蜜桃| 欧洲激情综合| 亚洲欧美日韩国产一区| 日韩精品一二区| 视频一区国产视频| 亚洲人成精品久久久| 日韩国产一二三区| 久久国产免费看| 国产极品嫩模在线观看91精品| 免费在线欧美黄色| 麻豆极品一区二区三区| 国产精品成久久久久| 日本精品影院| 亚洲精品一二三区区别| 中文字幕av亚洲精品一部二部| 日韩欧美高清一区二区三区| 日韩avvvv在线播放| 国产精品美女在线观看直播| 久久91视频| 欧美gv在线| 在线视频精品| 日本成人一区二区| 卡一卡二国产精品| 三级精品视频| 亚洲专区视频| 久久狠狠久久| 视频在线不卡免费观看| 精品一区在线| 久久香蕉精品| 欧美激情aⅴ一区二区三区 | 国产劲爆久久| 成人看片网站| 丝袜美腿亚洲一区二区图片| 日本aⅴ亚洲精品中文乱码| 麻豆91小视频| 欧美日韩国产一区二区三区不卡 | 久久亚洲电影| 国产美女亚洲精品7777| 国产一区二区三区不卡视频网站 | 免费一级片91| 另类欧美日韩国产在线| 日本久久成人网| 首页欧美精品中文字幕| 国产精品久久| 99精品在线观看| 日本中文字幕一区二区视频| 精品资源在线| 国产一区白浆| 欧美a级一区二区| 91精品观看| 国产欧美二区| 亚洲激情另类| 久久99精品久久久久久园产越南| 国产一区二区精品久| 日韩天堂av| 精品亚洲精品| 男人的天堂亚洲一区| 国产一区不卡| 一区二区高清| 日韩电影免费网址| 欧美天堂一区二区| 亚洲成人二区| 国产日韩欧美一区| 国产精品7m凸凹视频分类| 国产另类在线| 西西人体一区二区| 高潮久久久久久久久久久久久久| 亚洲高清不卡| 亚洲精品女人|