1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 # 需求 4 import numbers 5 6 7 class Field: 8 pass 9 10 11 class IntField(Field): 12 def __init__(self, db_column, min_value=None, max_value=None): 13 self._value = None 14 self.db_column = db_column 15 self.min_value = min_value 16 self.max_value = max_value 17 if min_value is not None: 18 if not isinstance(min_value, numbers.Integral): 19 raise ValueError('min_value must be int') 20 elif min_value < 0: 21 raise ValueError('min_value must be positive int') 22 if max_value is not None: 23 if not isinstance(max_value, numbers.Integral): 24 raise ValueError('max_value must be int') 25 elif min_value < 0: 26 raise ValueError('max_value must be positive int') 27 if min_value is not None and max_value is not None: 28 if min_value > max_value: 29 raise ValueError('min_value must be smaller than max_value') 30 31 def __get__(self, instance, owner): 32 return self._value 33 34 def __set__(self, instance, value): 35 if not isinstance(value, numbers.Integral): 36 raise ValueError('int value need') 37 if value < self.min_value or value > self.max_value: 38 raise ValueError('value must between min_value and max_value') 39 self._value = value 40 41 42 class CharField(Field): 43 def __init__(self, db_column, max_length=None): 44 self._value = None 45 self.db_column = db_column 46 if max_length is None: 47 raise ValueError('you must spcify max_length for CharField') 48 self.max_length = max_length 49 50 def __get__(self, instance, owner): 51 return self._value 52 53 def __set__(self, instance, value): 54 if not isinstance(value, str): 55 raise ValueError('string value need') 56 57 if len(value) > self.max_length: 58 raise ValueError('value len excess len of max_length') 59 self._value = value 60 61 62 class ModelMetaClass(type): 63 def __new__(cls, name, bases, attrs, **kwargs): 64 if name == 'BaseModel': 65 return super().__new__(cls, name, bases, attrs, **kwargs) 66 fields = {} 67 for key, value in attrs.items(): 68 if isinstance(value, Field): 69 fields[key] = value 70 attrs_meta = attrs.get('Meta', None) 71 _meta = {} 72 db_table = name.lower() 73 if attrs_meta is not None: 74 table = getattr(attrs_meta, 'db_table', None) 75 if table is None: 76 db_table = table 77 _meta['db_table'] = db_table 78 attrs['_meta'] = _meta 79 attrs['fields'] = fields 80 del attrs['Meta'] 81 return super().__new__(cls, name, bases, attrs, **kwargs) 82 83 84 class BaseModel(metaclass=ModelMetaClass): 85 def __init__(self, *args, **kwargs): 86 for key, value in kwargs.items(): 87 setattr(self, key, value) 88 return super().__init__() 89 90 def save(self): 91 fields = [] 92 values = [] 93 for key, value in self.fields.items(): 94 db_column = value.db_column 95 if db_column is None: 96 db_column = key.lower() 97 fields.append(db_column) 98 value = getattr(self, key) 99 values.append(str(value)) 100 101 sql = 'insert {db_table}({fields}) value({values})'.format(db_table=self._meta['db_table'], fields=','.join(fields), values=','.join(values)) 102 print(sql) 103 104 105 class User(BaseModel): 106 name = CharField(db_column='name', max_length=10) 107 age = IntField(db_column='age', min_value=0, max_value=100) 108 109 class Meta: 110 db_table = 'user' 111 112 113 if __name__ == '__main__': 114 user = User() 115 user.name = 'zy' 116 user.age = 21 117 user.save()
insert user(name,age) value(zy,21)