python and orm and mateclass

#!/usr/bin/env python3

-- coding: utf-8 --

2.按照上面的接口实现ORM

首先定义Field类,他负责保存数据库的字段名和字段类型

class Field(object):
def init(self, name, column_type):
self.name = name
self.column_type = column_type
def str(self):
return ‘<%s:%s>’ % (self.class.name, self.name)
#在Field的基础上,进一步定义各种类型的Field,
#比如StringField,IntegerField等等
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’)

3.编写ModegMateclass

class ModelMetaclass(type):
def new(cls, name, bases, attrs):
if name==‘Model’:
return type.new(cls, name, bases, attrs)
print(‘Found model: %s’ % name)
mappings = dict()
for k, v in attrs.items():
if isinstance(v, Field):
print(‘Found mapping: %s ==> %s’ % (k, v))
mappings[k] = v
for k in mappings.keys():
attrs.pop(k)
attrs[‘mappings’] = mappings # 保存属性和列的映射关系
attrs[‘table’] = name # 假设表名和类名一致
return type.new(cls, name, bases, attrs)

和编写 基类 Model

class Model(dict, metaclass=ModelMetaclass):
def init(self, **kw):
super(Model, self).init(**kw)
def getattr(self, key):
try:
print(‘self[key]’,self[key])
return self[key]
except KeyError:
raise AttributeError(r"‘Model’ object has no attribute ‘%s’" % key)
def setattr(self, key, value):
self[key] = value
def save(self):
fields = []
params = []
args = []
for k, v in self.mappings.items():
print(‘self.mappings.items:vname:’,v.name)
print(‘self.mappings.items✌️’,v)
fields.append(v.name)
params.append(’?’)
print(‘getattr(self, k, None):k:’,k)
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’ % str(args))

#1.调用的接口

class User(Model):
# 定义类的属性到列的映射:
id = IntegerField(‘pid’)
name = StringField(‘pusername’)
email = StringField(‘pemail’)
password = StringField(‘passwd’)

创建一个实例:

u = User(id=0000, name=‘ll’, email=‘625@qq.com’, password=‘6625’)

保存到数据库:

u.save()
‘’‘其中,父类Model和属性类型StringField、IntegerField
是由ORM框架提供的,剩下的魔术方法比如save()全部由metaclass自动完成。
虽然metaclass的编写会比较复杂,但ORM的使用者用起来却异常简单。
‘’’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值