使用元类实现Django的ORM

种地  金牌会员 | 2024-5-14 22:33:20 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 942|帖子 942|积分 2826

一、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()
复制代码
代码运行结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表