翼度科技»论坛 编程开发 python 查看内容

使用元类实现Django的ORM

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
一、ORM基本介绍
  1. ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM。
复制代码
二、实现目标
  1. 创建一个实例对象,用创建它的类名当做数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句
复制代码
如图:

三、代码实现
  1. class ModelMetaClass(type):
  2.     def __new__(cls, name, bases, attrs):
  3.         mappings = dict()
  4.         for k, v in attrs.items():
  5.             # 只处理类中属性值为元组的键值对
  6.             if isinstance(v, tuple):
  7.                 mappings[k] = v
  8.         # 处理完成后删除属性
  9.         for k in mappings:
  10.             attrs.pop(k)
  11.         attrs["__mappings__"] = mappings
  12.         attrs["__table__"] = name
  13.         # 这里不能用type(name, bases, attrs) 直接返回创建好的类, 不会触发type的__init__方法
  14.         return type.__new__(cls, name, bases, attrs)
  15. class Model(metaclass=ModelMetaClass):
  16.     # uid = ("uid", "int unsigned")
  17.     # name = ("username", "varchar(30)")
  18.     # email = ("email", "varchar(30)")
  19.     # password = ("password", "varchar(30)")
  20.     def __init__(self, **kwargs):
  21.         # 将关键字参数添加到实例属性
  22.         for k, v in kwargs.items():
  23.             setattr(self, k, v)
  24.     def save(self):
  25.         table_name = self.__table__
  26.         field = list()
  27.         args = list()
  28.         for k, v in self.__mappings__.items():
  29.             field.append(v[0])
  30.             arg = getattr(self, k, None)
  31.             # ["12345","""'Michael'""","""'test@orm.org'""","""'my-pwd'"""]
  32.             if isinstance(arg, str):
  33.                 args.append("""'{}'""".format(arg))
  34.             else:
  35.                 args.append(str(arg))
  36.         sql = "insert into {}({}) values ({})".format(table_name, ",".join(field), ",".join(args))
  37.         print(f"SQL语句: {sql}")
  38. class User(Model):
  39.     uid = ("uid", "int unsigned")
  40.     name = ("username", "varchar(30)")
  41.     email = ("email", "varchar(30)")
  42.     password = ("password", "varchar(30)")
  43. u = User(uid=12345, name="Michael", email="test@orm.org", password="my-pwd")
  44. u.save()
复制代码
代码运行结果:


来源:https://www.cnblogs.com/cs-songbai/p/18087184
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具