python ORM model定义
from numbers import Integral class IntFiled: ###数据描述符 def __set__(self, instance, value): print(instance,value) if not isinstance(value,Integral): raise ValueError("int value need") if value <=0 or value>100: raise ValueError("0<age<100") self.value=value def __get__(self, instance, owner): print(instance,owner) return self.value def __delete__(self, instance): pass class User:##ORM model 定义 age=IntFiled() user=User() user.age=12 print(user.age)
代码示例2
from numbers import Integral class ModelField(): pass class CharField(ModelField): def __init__(self,db_column,max_length=None): self._value=None self.db_column=db_column self.max_length=max_length if max_length is not None: if not isinstance(max_length,Integral): raise ValueError('max_length must be int') elif max_length<1: raise ValueError('max_length must be gt 1') def __get__(self, instance, owner): return self._value def __set__(self, instance, value): if not isinstance(value,str): raise ValueError('value must be str') elif len(value)>self.max_length: raise ValueError('max_length max value is %s'%self.max_length) self._value= value class IntField(ModelField): def __init__(self,db_column): self._value=None self.db_column=db_column def __get__(self, instance, owner): return self._value def __set__(self, instance, value): if not isinstance(value,Integral): raise ValueError('value must be int') elif value<0: raise ValueError('value must be > 0') self._value= value class ModelMetaClass(type): def __new__(cls, name,bases,attrs, **kwargs): if name=="BaseModel": return super().__new__(cls, name,bases,attrs, **kwargs) fields={} for key,value in attrs.items(): if isinstance(value,ModelField): fields[key]=value attrs_meta=attrs.get('Meta',None) table_name=name.lower() if attrs_meta: table=getattr(attrs_meta,'table_name',None) if table: table_name=table _meta={} _meta["table_name"]=table_name attrs["_meta"]=_meta attrs["fields"]=fields del attrs['Meta'] return super().__new__(cls, name,bases,attrs, **kwargs) class BaseModel(metaclass=ModelMetaClass): def __init__(self,*args,**kwargs): for key,value in kwargs.items(): setattr(self,key,value) return super().__init__() def save(self): columns=[] values=[] for key,value in self.fields.items(): db_column= value.db_column if value.db_column else key.lower() columns.append(db_column) if isinstance(getattr(self,key),str): value="'"+getattr(self,key)+"'" else: value=str(getattr(self,key)) values.append(value) sql="insert into {table_name} ({columns}) values({values})".format(table_name=self._meta['table_name'],columns=",".join(columns),values=",".join(values)) print(sql)##insert into user (aaa,age) values('zhangsan',12) class UserModel(BaseModel): name=CharField(db_column="aaa",max_length=32) age=IntField(db_column="age") class Meta: table_name="user" if __name__=='__main__': user=UserModel() user.name="zhangsan" user.age=12 user.save()