1. 程式人生 > >Python程式設計:metaclass元類實現簡單的ORM

Python程式設計:metaclass元類實現簡單的ORM

ORM全稱“Object Relational Mapping”,即物件-關係對映
把關係資料庫的一行對映為一個物件,一個類對應一個表
這樣,寫程式碼更簡單,不用直接操作SQL語句。

# -*- coding: utf-8 -*-

# @File    : 元類例項ORM.py
# @Date    : 2018-06-01
# @Author  : Peng Shiyu

# 先定義metaclass,就可以建立類,最後建立例項

class Field(object):
    """儲存資料庫表的欄位名和欄位型別"""
    def __init__(self, name, column_type)
:
self.name = name self.column_type = column_type def __str__(self): return "<%s %s %s>"%(self.__class__.__name__, self.name, self.column_type) # 定義各種型別 class IntegerField(Field): def __init__(self, name): super(IntegerField, self).__init__(name, "int"
) class StringField(Field): def __init__(self, name): super(StringField, self).__init__(name, "varchar(255)") # 編寫元類 """ 排除掉對Model類的修改; 在當前類(比如User)中查詢定義的類的所有屬性,如果找到一個Field屬性,就把它儲存到一個__mappings__的dict中, 同時從類屬性中刪除該Field屬性,否則,容易造成執行時錯誤(例項的屬性會遮蓋類的同名屬性); 把表名儲存到__table__中,這裡簡化為表名預設為類名。 """
class ModelMetaclass(type): def __new__(cls, name, bases, attrs): if name == "Model": return type.__new__(cls, name, bases, attrs) print("Fond Model: %s"% name) # 查詢Field欄位 mappings = {} for k, v in attrs.items(): if isinstance(v, Field): print("Fond Field: %s => %s"% (k, v)) mappings[k] = v # 彈出Field欄位 for k in mappings.keys(): attrs.pop(k) attrs["__mappings__"] = mappings # 儲存屬性和列的對映關係 attrs["__table__"] = name # 假設表名和類名一致 return type.__new__(cls, name, bases, attrs) # 在Model類中,就可以定義各種操作資料庫的方法,比如save(),delete(),find(),update等等 class Model(dict, metaclass=ModelMetaclass): def __init__(self, **kwargs): super(Model, self).__init__(**kwargs) def __getattr__(self, key): return self[key] def __setattr__(self, key, value): self[key] = value def save(self): fields = [] params = [] args = [] for k, v in self.__mappings__.items(): fields.append(v.name) params.append("?") args.append(getattr(self, k, None)) sql = "insert into %s (%s) VALUES (%s)"% (self.__table__, ",".join(fields), ",".join(params)) print("sql: %s"% sql) print("args: %s"% args) class User(Model): # 定義類的屬性到列的對映: id = IntegerField("id") name = StringField("name") email = StringField("email") password = StringField("password") if __name__ == '__main__': # # 建立一個例項 user = User(id=1, name="Tom", email="[email protected]", password="123456") # 儲存到資料庫 user.save() # 訪問元素 print(user.name) print(user["name"]) user.name = "jack" print(user.name) """ Fond Model: User Fond Field: id => <IntegerField id int> Fond Field: name => <StringField name varchar(255)> Fond Field: email => <StringField email varchar(255)> Fond Field: password => <StringField password varchar(255)> sql: insert into User (id,name,email,password) VALUES (?,?,?,?) args: [1, 'Tom', '[email protected]', '123456'] Tom Tom jack """

相關推薦

Python程式設計metaclass實現簡單ORM

ORM全稱“Object Relational Mapping”,即物件-關係對映 把關係資料庫的一行對映為一個物件,一個類對應一個表 這樣,寫程式碼更簡單,不用直接操作SQL語句。 # -*- coding: utf-8 -*- # @File

python——type()、metaclass和精簡ORM框架

定制 定義 attribute varchar elm cep 實例 編寫代碼 __main__ 1、type()函數 #type()函數既可以返回一個對象的類型,又可以創建出新的類型, # 比如,我們可以通過type()函數創建出Hello類,而無需通過cl

Python程式設計aiohttp庫伺服器端簡單使用

通過flask和aiohttp對比著來看 flask from flask import Flask app = Flask(__name__) @app.route("/") de

Python實戰,通過實現資料庫ORM框架

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是Python專題的第19篇文章,我們一起來用元類實現一個簡易的ORM資料庫框架。 本文主要是受到了廖雪峰老師Python3入門教程的啟發,不過廖老師的部落格有些精簡,一些小白可能看起來比較吃力。我在他的基礎上做了一些補充和註釋

python 簡單解釋

.html www ren 有用 copy tle 例子 sky -i 本文轉自博客:http://www.cnblogs.com/piperck/p/5840443.html 作者:piperck python 類和元類(metaclass)的理解和簡單運用 (一) p

12.python-metaclass

*args bject tro 接收 自定義 all metaclass 控制 module 1.python中一切皆是對象,類本身也是一個對象,當使用關鍵字class的時候,python解釋器在加載class的時候會創建一個對象(這裏的對象指的是類而非類的實例) cla

python程式設計從入門到實踐學習筆記-

面向物件程式設計時,都會遇到一個概念,類,python也有這個概念,下面我們通過程式碼來深入瞭解下。 建立和使用類 class Dog():    def __init__(self, name, age):        

Python程式設計使用sys、argparse、click、fire實現命令列解析

python實現指令碼命令列的庫有: 內建庫sys 內建庫argparse 第三方庫click 第三方庫fire 內建庫sys sys.argv 包含命令列引數列表,第一個引數是檔名 sys_demo.py import sys d

python3通過例項講解實現_ORM01

ORM全稱“Object Relational Mapping”,即物件-關係對映,就是把關係資料庫的一行對映為一個物件,也就是一個類對應一個表,這樣,寫程式碼更簡單,不用直接操作SQL語句。 明確下我們的需求: 我們要建立一個類,並把類對映到資料庫的一張表,並校驗資料庫每個欄位的取

使用python 實現ORM關係對映

元類實現ORM 1. ORM是什麼 ORM 是 python程式語言後端web框架 Django的核心思想,“Object Relational Mapping”,即物件-關係對映,簡稱ORM。 一個句話理解就是:建立一個例項物件,用建立它的類名當做資料表名,用建立它的類屬性對應資料表的

Python程式設計zope.interface實現介面

pypi : https://pypi.org/project/zope.interface/ 文件:https://zopeinterface.readthedocs.io/en/latest/index.html 面向物件中介面負責定義規則,具體實現類來實現規則 安裝 p

Python程式設計從入門到實踐》第9章- 習題

文章目錄 9-1 餐館 9-2 三家餐館 9-3使用者 9-4 就餐人數 9-5 嘗試登入次數 9-6冰淇淋小店 9-7 管理員 9-8 許可權 9-9 電瓶升級 9-10 匯入Resta

Python程式設計從入門到實踐》第2章 變數和簡單資料型別

第2章 變數和簡單資料型別 2-3 個性化的訊息 將使用者的姓名存到一個變數中,並向該使用者顯示一條訊息。顯示的訊息應非常簡單,如“Hello Eric, would you like to lear

Python程式設計用兩個棧實現佇列

用兩個棧實現佇列思路: 入隊進入一個棧,從另一棧出隊 外加一個元素傳遞的方法,負責將元素從入隊棧轉移到出隊棧 入隊棧:1,2,3 出隊棧:3,2,1 # 先實現一個棧 class Stack():

Python程式設計從入門到實踐》第9章

第9章 類 9-1 餐館 建立一個名為Restaurant 的類,其方法__init__() 設定兩個屬性:restaurant_name 和cuisine_type 。建立一個名為describe_

通過 python的 __call__ 函式與 實現單例模式

簡單一句話,當一個類實現__call__方法時,這個類的例項就會變成可呼叫物件。 直接上測試程式碼 class ClassA: def __call__(self, *args, **kwargs): print('call ClassA i

Python程式設計從入門到實踐》第九章

第九章 類 面向物件程式設計;你定義一大類物件都有的通用行為。基於類建立物件時,每個物件都自動具備這種通用行為,然後可根據需要賦予每個物件獨特的個性。 根據類來建立物件被稱為例項化。你將指定可在例項中儲存什麼資訊,定義可對這些例項執行哪些操作。你還將編寫一些類

C#中使用SerialPort實現簡單串列埠程式設計

由於專案需要通過串列埠通訊,所以學習一下在此做一下筆記。 .NET 2.0提供了串列埠通訊的功能,其名稱空間是System.IO.Ports。這個新的框架不但可以訪問計算機上的串列埠,還可以和串列埠裝置進行通訊。 建立C#串列埠通訊程式之建立SerialPort 物件 通

Python程式設計urlsplit, urlparse簡單區別

顧名思義,urlsplit是拆分,而urlparse是解析,所以urlparse粒度更為細緻 區別 split函式在分割的時候,path和params屬性是在一起的 程式碼示例 # -*- coding: utf-8 -*- from urllib.parse import

Python程式設計namedtuple命名組和dict字典相互轉換

from collections import namedtuple dct = { "name": "Tom", "age": 24 } Person = namedtuple("