1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| import pymysql import numbers
db = pymysql.connect(host='localhost', user='root', password='123456', database='dbtest1', port=3306, autocommit=True)
cursor = db.cursor()
class Field: pass
class IntField(Field): def __init__(self, db_colum, min_value=None, max_value=None): self._value = None self.min_value = min_value self.max_value = max_value self.db_colum = db_colum if min_value is not None: if not isinstance(min_value, numbers.Integral): raise ValueError("min_value must be int") elif min_value < 0: raise ValueError("min_value must be positive int")
if max_value is not None: if not isinstance(max_value, numbers.Integral): raise ValueError("max_value must be int") elif max_value < 0: raise ValueError("max_value must be positive int")
if min_value and max_value is not None: if min_value > max_value: raise ValueError("min_value must be smaller than max_value")
def __get__(self, instance, owner): return self.value
def __set__(self, instance, value): if not isinstance(value, numbers.Integral): raise ValueError("int value need") if value < self.min_value or value > self.max_value: raise ValueError("value must between min_value and max_value")
self.value = value
class CharField(Field): def __init__(self, db_colum, max_length=None): self._value = None self.db_colum = db_colum self.max_length = max_length
def __get__(self, instance, owner): return self.value
def __set__(self, instance, value): if not isinstance(value, str): raise ValueError("String value need") if len(value) > self.max_length: return ValueError("value length excess len of max_length")
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, Field): fields[key] = value attrs_meta = attrs.get("Meta", None) _meta = {} db_table = name.lower() if attrs_meta is not None: table = getattr(attrs_meta, "db_table", None) if table is not None: db_table = table _meta["db_table"] = db_table attrs["_meta"] = _meta attrs["fields"] = fields 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): fields = [] values = [] for key, value in self.fields.items(): db_colum = value.db_colum if db_colum is None: db_colum = key.lower() fields.append(db_colum) value = getattr(self, key) values.append(str(value)) sql_save = """INSERT INTO {db_table}({fields}) VALUES({values})""".format(db_table=self._meta["db_table"], fields=",".join(fields), values=",".join(values)) try: cursor.execute(sql_save) db.commit() print("执行成功") except: db.rollback() print("执行失败") pass
if __name__ == "__main__": class User(BaseModel): name = CharField(db_colum="name", max_length=100) age = IntField(db_colum="age", min_value=1, max_value=100)
user = User(name="'lzh'", age=19) user.save()
|