当前位置: 首页 > news >正文

分析北师大教育学原理网站建设动易网站频道栏目字体大小修改

分析北师大教育学原理网站建设,动易网站频道栏目字体大小修改,大连网页搜索排名提升,网站推广宣传方案概述 什么是ORM?    ORM全称“Object Relational Mapping”#xff0c;即对象-关系映射#xff0c;就是把关系数据库的一行映射为一个对象#xff0c;也就是一个类对应一个表#xff0c;这样#xff0c;写代码更简单#xff0c;不用直接操作SQL语句。 现在我们就要实…概述 什么是ORM?    ORM全称“Object Relational Mapping”即对象-关系映射就是把关系数据库的一行映射为一个对象也就是一个类对应一个表这样写代码更简单不用直接操作SQL语句。 现在我们就要实现简易版ORM。  效果 class Person(Model):定义类的属性到列的映射pid IntegerField(id)names StringField(username)email StringField(email)password StringField(password)p Person(pid10086, names晓明, email10086163.com, password123456) p.save() 通过执行save()方法 动态生成sql插入语句, 是不是很神奇 那我们现在开始解析原理吧 步骤 首先我们要定义一个 Field 类 它负责保存数据库表的字段名和字段类型 class Field(object):def __init__(self, name, column_type):self.name nameself.column_type column_typedef __str__(self):return %s:%s % (self.__class__.__name__, self.name) 在 Field 的基础上进一步定义各种类型的 Field比如 StringFieldIntegerField 等等 class StringField(Field):def __init__(self, name):super(StringField, self).__init__(name, varchar(100))class IntegerField(Field):def __init__(self, name):super(IntegerField, self).__init__(name, bigint) 下一步就是编写最复杂的 ModelMetaclass class ModelMetaclass(type):def __new__(cls, name, bases, attrs):if name Model:return type.__new__(cls, name, bases, attrs)mappings dict()print(Found class: %s % name)for k, v in attrs.items():if isinstance(v, Field):print(Found mapping: %s %s % (k, v))mappings[k] vfor k in mappings.keys():attrs.pop(k)attrs[__table__] name # 表名和类名一致attrs[__mappings__] mappings # 保存属性和列的映射关系return type.__new__(cls, name, bases, attrs) 最后就是基类  Model: class Model(metaclassModelMetaclass):def __init__(self, **kwargs):_setattr setattrif kwargs:for k, v in kwargs.items():_setattr(self, k, v)super(Model, self).__init__()def save(self):fields []params []args []for k, v in self.__mappings__.items():fields.append(k)params.append(?)args.append(getattr(self, k, None))sql insert into %s (%s) values (%s) % (self.__table__, ,.join(fields), ,.join(params))print(插入语句: %s % sql)print(参数: %s % str(args))def update(self):fields []args []for k, v in self.__mappings__.items():if getattr(self, k, None):fields.append(k?)args.append(getattr(self, k, None))sql update %s set %s % (self.__table__, ,.join(fields))print(更新语句: %s % sql)print(参数: %s % args)def filter(self, *args):passdef delete(self):pass 当用户定义一个 class Person(Model) 继承父类时Python解释器会在当前类 Person 的定义中找 __metaclass__如果没有找到就继续到父类中找 __metaclass__实在找不到就用默认 type 类。 我们在父类 Model 中定义了 __metaclass__ 的 ModelMetaclass 来创建 Person 类所以 metaclass 隐式地继承到子类。 在 ModelMetaclass 中一共做了几件事情 排除掉对 Model 类的修改 在当前类比如 Person 中查找定义的类的所有属性如果找到一个 Field 属性就把它保存到一个 __mappings__ 的dict中同时从类属性中删除该Field属性否则容易造成运行时错误 把表名保存到 __table__ 中这里简化为表名默认为类名。 在Model类中就可以定义各种操作数据库的方法比如save()delete()find()update() 等等。 我们实现了save(), update()方法把一个实例保存到数据库中。因为有表名属性到字段的映射和属性值的集合就可以构造出INSERT语句和UPDATE语句。 编写代码试试 class UserInfo(Model):定义类的属性到列的映射uid IntegerField(uid)name StringField(username)email StringField(email)password StringField(password)class Person(Model):定义类的属性到列的映射pid IntegerField(id)names StringField(username)email StringField(email)password StringField(password)p Person(pid10086, names晓明, email10086163.com, password123456) p.save() u2 UserInfo(password123456) u2.update() 输出 Found class: UserInfo Found mapping: uid IntegerField:uid Found mapping: name StringField:username Found mapping: email StringField:email Found mapping: password StringField:password Found class: Person Found mapping: pid IntegerField:id Found mapping: names StringField:username Found mapping: email StringField:email Found mapping: password StringField:password 插入语句: insert into Person (pid,names,email,password) values (?,?,?,?) 参数: [10086, 晓明, 10086163.com, 123456] 更新语句: update UserInfo set password? 参数: [123456] 结束语 就这样一个小巧的ORM就这么完成了。是不是学到了很多呢 这里利用的是元编程很多Python框架都运用了元编程达到动态操作类。 注上述代码列子 结合了廖雪峰的列子和少量的django ORM源码。 完整代码 class Field(object):def __init__(self, name, column_type):self.name nameself.column_type column_typedef __str__(self):return %s:%s % (self.__class__.__name__, self.name)class StringField(Field):def __init__(self, name):super(StringField, self).__init__(name, varchar(100))class IntegerField(Field):def __init__(self, name):super(IntegerField, self).__init__(name, bigint)class ModelMetaclass(type):def __new__(cls, name, bases, attrs):if name Model:return type.__new__(cls, name, bases, attrs)mappings dict()print(Found class: %s % name)for k, v in attrs.items():if isinstance(v, Field):print(Found mapping: %s %s % (k, v))mappings[k] vfor k in mappings.keys():attrs.pop(k)attrs[__table__] name # 表名和类名一致attrs[__mappings__] mappings # 保存属性和列的映射关系return type.__new__(cls, name, bases, attrs)class Model(metaclassModelMetaclass):def __init__(self, **kwargs):_setattr setattrif kwargs:for k, v in kwargs.items():_setattr(self, k, v)super(Model, self).__init__()def save(self):fields []params []args []for k, v in self.__mappings__.items():fields.append(k)params.append(?)args.append(getattr(self, k, None))sql insert into %s (%s) values (%s) % (self.__table__, ,.join(fields), ,.join(params))print(插入语句: %s % sql)print(参数: %s % str(args))def update(self):fields []args []for k, v in self.__mappings__.items():if getattr(self, k, None):fields.append(k?)args.append(getattr(self, k, None))sql update %s set %s % (self.__table__, ,.join(fields))print(更新语句: %s % sql)print(参数: %s % args)def filter(self, *args):passdef delete(self):passclass UserInfo(Model):定义类的属性到列的映射uid IntegerField(uid)name StringField(username)email StringField(email)password StringField(password)class Person(Model):定义类的属性到列的映射pid IntegerField(id)names StringField(username)email StringField(email)password StringField(password)p Person(pid10086, names晓明, email10086163.com, password123456) p.save() u2 UserInfo(password123456) u2.update()
http://www.hkea.cn/news/14274346/

相关文章:

  • 飞创网站建设酒店网站建设的构思
  • 小型行业网站建设维护成本域名地址大全
  • 用cms做网站怎么样百度账号
  • 做网站gif代码国际设计师网站
  • 建设通同类网站搭建网站成本
  • 网站美工的重要性杭州哪些做网站公司
  • 哈尔滨网站建设公司哪家好wordpress3.6下载
  • 网站开发语言分辨一个域名可以做两个网站么
  • 做抛物线的网站合肥瑶海区范围
  • 行业门户网站设计wordpress 加密连接
  • 网站建设费用 会计分录wordpress文章中出站
  • 用什么做网站方便公司做网站哪个好
  • 企业网站建设模版建设网站的技术方案是啥
  • 阅读网站源码建设银行网银登录入口
  • 网站被抄袭怎么办淘宝联盟 wordpress
  • 电商设计师网站餐厅设计
  • 网站建设经济可行性wordpress手机导航栏
  • 专业网站推广公司wordpress音乐模版
  • 北票网站建设100平米美容院装修设计
  • 网站设计基本原则专业网页制作软件能帮助客户组织和管理
  • 如何更新网站百度云网站建设教程视频
  • 做文案策划需要用到的网站企业建网站作用
  • 北京+网站建设北京市轨道交通建设管理有限公司网站
  • 广东建网站的公司三亚兼职网站
  • 仿素材下载网站源码企业信息网查询
  • 天津网络网站制作公司多个门户是做二级域名还是做多个网站
  • 网站建设及推广好学习吗社交网站开发
  • 精品课程网站建设论文手机网站报名链接怎么做
  • 沧州*网站建设网站如何做中英文效果
  • 网站的营销策略wordpress主题空白