class Field(object): def __init__(self, name, type): self.name, self.type = name, type class StringField(Field): def __init__(self, name): super().__init__(name, 'sql-string') class IntegerField(Field): def __init__(self, name): super().__init__(name, 'sql-int') class ModelMetaclass(type): def __new__(cls, name, bases, attrs): mappings=dict() for k,v in attrs.items(): # 将需要保存的表转为 Name-Object 形式储存在 Mappings 中 if isinstance(v, Field): mappings[k]=v for k in mappings.keys(): attrs.pop(k) # 实例对象不需要 Name 属性 attrs['__table__']=name attrs['__mappings__']=mappings return type.__new__(cls, name, bases, attrs) class Model(dict, metaclass=ModelMetaclass): def save(self): fields, args = [],[] for k, v in self.__mappings__.items(): # eg. k=id v=FieldObj v.name=uid self[k]=12345 print(f'{k} => {v.type} => {v.name} = {self[k]}') fields.append(v.name) args.append(self[k]) print('SQL: %s\nARGS: %s' % ('insert into %s (%s)' % (self.__table__, ','.join(fields)), str(args))) class User(Model): id = IntegerField('uid') name = StringField('username') email = StringField('email') password = StringField('password') u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd', others='wrong-text') u.save()
Sign in to make a reply
用户7495839230