zoukankan      html  css  js  c++  java
  • ❥纯手撸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)
  • 相关阅读:
    phpstorm+Xdebug断点调试PHP
    解决PHP curl https时error 77(Problem with reading the SSL CA cert (path? access rights?))
    Windows下安装并设置Redis
    PHP使用数据库的并发问题
    PHP 数组排序
    js 异常处理
    nginx php上传大文件的设置(php-fpm)
    第二章 基本数据类型:常见数据类型的方法
    第一章 python介绍、变量、数据类型、流程控制语句等
    python2.x和python3.x的区别
  • 原文地址:https://www.cnblogs.com/lddragon/p/11683995.html
Copyright © 2011-2022 走看看