1. class Field(object):
    2. def __init__(self, name, column_type):
    3. self.name = name
    4. self.column_type = column_type
    5. def __str__(self):
    6. return "<%s:%s>" % (self.__class__.__name__, self.name)
    7. class IntegerField(Field):
    8. def __init__(self, name):
    9. super(IntegerField, self).__init__(name, "bigint")
    10. class StringField(Field):
    11. def __init__(self, name):
    12. super(StringField, self).__init__(name, "varchar(100)")
    13. class ModelMetaClass(type):
    14. def __new__(cls, name, bases, attrs):
    15. if name == "Model":
    16. print("Model")
    17. return type.__new__(cls, name, bases, attrs)
    18. print("Found Models: %s " % name)
    19. mappings = dict()
    20. for k, v in attrs.items():
    21. if isinstance(v, Field):
    22. print("Found Mapping: %s => %s" % (k, v))
    23. mappings[k] = v
    24. for k in mappings.keys():
    25. attrs.pop(k)
    26. attrs["__mappings__"] = mappings
    27. attrs["__table__"] = name
    28. return type.__new__(cls, name, bases, attrs)
    29. class Model(dict, metaclass=ModelMetaClass):
    30. def __init__(self, **kwargs):
    31. super(Model, self).__init__(**kwargs)
    32. def __getattr__(self, key):
    33. try:
    34. return self[key]
    35. except KeyError:
    36. raise AttributeError(r"'Model' object has no attribute '%s'" % key)
    37. def __setattr__(self, key, value):
    38. self[key] = value
    39. def save(self):
    40. fields = []
    41. params = []
    42. args = []
    43. for k, v in self.__mappings__.items():
    44. fields.append(v.name)
    45. params.append("?")
    46. args.append(getattr(self, k, None))
    47. sql = "insert into %s (%s) values(%s)" % (self.__table__, ",".join(fields), ",".join(params))
    48. print("sql: %s" % sql)
    49. print("ARGS: %s" % str(args))
    50. class User(Model):
    51. id = IntegerField('id')
    52. name = StringField('name')
    53. email = StringField("email")
    54. password = StringField('password')
    55. if __name__ == "__main__":
    56. u = User(id=123, name="test", email="xxxx@qq.com", password="pass")
    57. u.save()