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()

 

posted @ 2019-11-28 19:34  howhy  阅读(402)  评论(0)    收藏  举报