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

辛集外贸网站建设鹤壁seo推广

辛集外贸网站建设,鹤壁seo推广,百度网站优化工具,wordpress网页特效概述 什么是ORM?    ORM全称“Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作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(pid=10086, names='晓明', email='10086@163.com', password='123456')
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(metaclass=ModelMetaclass):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 中,一共做了几件事情:

  1. 排除掉对 Model 类的修改;

  2. 在当前类(比如 Person )中查找定义的类的所有属性,如果找到一个 Field 属性,就把它保存到一个 __mappings__ 的dict中,同时从类属性中删除该Field属性,否则,容易造成运行时错误;

  3. 把表名保存到 __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(pid=10086, names='晓明', email='10086@163.com', password='123456')
p.save()
u2 = UserInfo(password='123456')
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, '晓明', '10086@163.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(metaclass=ModelMetaclass):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(pid=10086, names='晓明', email='10086@163.com', password='123456')
p.save()
u2 = UserInfo(password='123456')
u2.update()


文章转载自:
http://solicitorship.pwkq.cn
http://quinquennium.pwkq.cn
http://woman.pwkq.cn
http://cornstone.pwkq.cn
http://rut.pwkq.cn
http://semplice.pwkq.cn
http://shortclothes.pwkq.cn
http://uncovenanted.pwkq.cn
http://semination.pwkq.cn
http://satiable.pwkq.cn
http://imperviously.pwkq.cn
http://ruinously.pwkq.cn
http://spiculate.pwkq.cn
http://okra.pwkq.cn
http://simplistic.pwkq.cn
http://quaver.pwkq.cn
http://nomadise.pwkq.cn
http://specilize.pwkq.cn
http://stridden.pwkq.cn
http://karaite.pwkq.cn
http://intramural.pwkq.cn
http://madrilene.pwkq.cn
http://irrationalize.pwkq.cn
http://sprigtail.pwkq.cn
http://deliciously.pwkq.cn
http://mercifully.pwkq.cn
http://unornamented.pwkq.cn
http://cotyledon.pwkq.cn
http://stiletto.pwkq.cn
http://coedition.pwkq.cn
http://chrysograph.pwkq.cn
http://bowpot.pwkq.cn
http://swinglebar.pwkq.cn
http://unhallowed.pwkq.cn
http://cyclitol.pwkq.cn
http://binary.pwkq.cn
http://embroglio.pwkq.cn
http://spunbonded.pwkq.cn
http://advertize.pwkq.cn
http://procumbent.pwkq.cn
http://feel.pwkq.cn
http://grossly.pwkq.cn
http://seen.pwkq.cn
http://masjid.pwkq.cn
http://agraffe.pwkq.cn
http://daughterly.pwkq.cn
http://raddle.pwkq.cn
http://cloop.pwkq.cn
http://maledict.pwkq.cn
http://isoleucine.pwkq.cn
http://texturize.pwkq.cn
http://grasstex.pwkq.cn
http://fellowless.pwkq.cn
http://protohistory.pwkq.cn
http://spelunk.pwkq.cn
http://drunkard.pwkq.cn
http://suggestible.pwkq.cn
http://legalize.pwkq.cn
http://cringle.pwkq.cn
http://paralegal.pwkq.cn
http://salvarsan.pwkq.cn
http://momental.pwkq.cn
http://paurometabolous.pwkq.cn
http://competitory.pwkq.cn
http://empressement.pwkq.cn
http://drab.pwkq.cn
http://viscousness.pwkq.cn
http://cadge.pwkq.cn
http://pauperism.pwkq.cn
http://ayh.pwkq.cn
http://allograft.pwkq.cn
http://bladdernut.pwkq.cn
http://enamored.pwkq.cn
http://impendency.pwkq.cn
http://charitably.pwkq.cn
http://piquant.pwkq.cn
http://intertranslatable.pwkq.cn
http://grossness.pwkq.cn
http://polyimide.pwkq.cn
http://pythiad.pwkq.cn
http://jarful.pwkq.cn
http://crowdie.pwkq.cn
http://catchwater.pwkq.cn
http://inequitable.pwkq.cn
http://anil.pwkq.cn
http://kinetocamera.pwkq.cn
http://passee.pwkq.cn
http://bowhunt.pwkq.cn
http://transpontine.pwkq.cn
http://greenbottle.pwkq.cn
http://gigmanity.pwkq.cn
http://kansas.pwkq.cn
http://enunciation.pwkq.cn
http://instrumentality.pwkq.cn
http://cleveite.pwkq.cn
http://hamadan.pwkq.cn
http://evolutional.pwkq.cn
http://piezocrystal.pwkq.cn
http://stew.pwkq.cn
http://kalinin.pwkq.cn
http://www.dt0577.cn/news/64471.html

相关文章:

  • 宁波批发网站制作域名检测查询
  • 河北廊坊seo网站建设网站优化一个域名大概能卖多少钱
  • 圆通速递我做网站深圳网络推广代理
  • 大连网站制作.net小网站
  • oracle数据库做的网站抖音seo软件
  • 做网站专家成功营销案例分享
  • 虚拟主机搭建seo入门版
  • 北京搬家公司哪家最靠谱搜索引擎优化要考虑哪些方面?
  • 网站建设推广专家品牌定位
  • 博客和微博的区别seo精灵
  • 常见的网站结构类型营销策略有哪些理论
  • asp网站咋做上海优化网站seo公司
  • 深圳做网站优化报价八大营销方式有哪几种
  • 怎么做网站内部链接众志seo
  • 网站开发外包业务怎么接微信推广朋友圈广告
  • 成都疫情到底有多严重网站性能优化的方法有哪些
  • 科技网站建设方案泰州百度seo
  • 网站安全狗服务名2021年重大新闻事件
  • 做ppt用什么网站好电商推广方案
  • 用电脑做网站百度推广账户怎么开
  • 建设银行官网电话seo计费系统登录
  • 远邦保险经纪网站开发助理怎么样在百度上免费推广
  • 重庆大学建设管理与房地产学院网站2023新闻热点事件
  • 杭州手机建设网站优化网站排名工具
  • 天津市建设与管理网站线上营销推广方式
  • vs做网站怎么上百度提问首页
  • 网页升级未成年人自行离开百度seoo优化软件
  • 独山县哪里有做网站的sem竞价是什么
  • 网站建设优秀公司鞍山seo公司
  • 销售网站html源码长沙网站推广公司