❥纯手撸ORM❥
from orm.mysql_class import MySql class Field(object): def __init__(self, name, field_type, primary_key, default): self.name = name self.field_type = field_type self.primary_key = primary_key self.default = default class StringField(Field): def __init__(self,name,field_type='varchar',primary_key=False,default=None): super(StringField, self).__init__(name, field_type, primary_key, default) class IntegerField(Field): def __init__(self,name,field_type='int',primary_key=False,default=0): super(IntegerField, self).__init__(name, field_type, primary_key, default) class MyMetaClass(type): def __new__(cls, class_name, class_bases, class_attrs): if class_name == 'Models': return type.__new__(cls, class_name, class_bases, class_attrs) table_name = class_attrs.get('table_name',class_name) primary_key = None mappings = {} for k, v in class_attrs.items(): if isinstance(v,Field): mappings[k] = v if v.primary_key: if primary_key: raise TypeError('只能有一个主键') primary_key = v.name for i in mappings: class_attrs.pop(i) if not primary_key: raise TypeError('没有主键') class_attrs['table_name'] = table_name class_attrs['primary_key'] = primary_key class_attrs['mappings'] = mappings return type.__new__(cls, class_name, class_bases, class_attrs) class Models(dict,metaclass=MyMetaClass): def __init__(self,**kwargs): super().__init__(**kwargs) def __getattr__(self, item): return self.get(item, '没有这个字段') def __setattr__(self, key, value): self[key] = value @classmethod def my_select(cls,**kwargs): md = MySql() if not kwargs: sql = "select * from %s"%cls.table_name res = md.select(sql) else: key = list(kwargs.keys())[0] values = kwargs.get(key) sql = "select * from %s where %s=?"%(cls.table_name,key) sql = sql.replace('?','%s') res = md.select(sql,values) print(res) if res: return [cls(**i) for i in res] def my_insert(self): ms = MySql() keys = [] values = [] wenhao = [] for k,v in self.mappings.items(): if not v.primary_key: keys.append(v.name) values.append(getattr(self,v.name,v.default)) wenhao.append('?') sql = "insert into %s(%s) values(%s)"%(self.table_name,','.join(keys),','.join(wenhao)) sql = sql.replace('?','%s') ms.execute(sql,values) def my_update(self): ms = MySql() field = [] values = [] primary_key = None for k, v in self.mappings.items(): if v.primary_key: primary_key = getattr(self,v.name,v.default) else: field.append(v.name+'=?') values.append(getattr(self,v.name)) sql = "update %s set %s where %s=%s"%( self.table_name, ','.join(field), self.primary_key, primary_key ) print(self.primary_key) print(primary_key) sql = sql.replace('?','%s') ms.execute(sql,values)
趁自己还没死 多折腾折腾