加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

手撸orm

发布时间:2020-12-15 07:27:22 所属栏目:Java 来源:网络整理
导读:orm的作用就是类和数据库的表的映射关系。 一个类代表的就是一张表,一个类实例化出来的对象就是一条记录。 from orm_demo import mysql_controlclass Field: def __init__(self,name,column_type,primary_key,default): self.name=name self.column_type=co

orm的作用就是类和数据库的表的映射关系。

一个类代表的就是一张表,一个类实例化出来的对象就是一条记录。

from orm_demo import  mysql_control

class Field:
    def __init__(self,name,column_type,primary_key,default):
        self.name=name
        self.column_type=column_type
        self.primary_key= primary_key
        self.default = default


class IntegerField(Field):
    def __init__(self,column_type="int",primary_key=False,default = 0):
        super().__init__( name,default)

class StringField(Field):
    def __init__(self,column_type='varchar(64)',default=None):
        super().__init__(name,default)

class OrmMetaClass(type):
    def __new__(cls,class_name,class_base,class_attr):
        if class_name == 'Models':
            return type.__new__(cls,class_attr)

        table_name = class_attr.get('table_name',class_name)

        mappings = {}

        primary_key = None

        for k,v in class_attr.items():
             if isinstance(v,Field):

                 mappings[k] = v

                 if v.primary_key:

                     if primary_key:
                         raise TypeError('只能有一个主键')

                     primary_key = v.name
        for k in mappings.keys():
            class_attr.pop(k)

        if not primary_key:
            raise TypeError('必须要有一个主键')

        class_attr['table_name'] = table_name
        class_attr['primary_key'] = primary_key
        class_attr['mappings'] = mappings

        return type.__new__(cls,class_attr)

class Models(dict,metaclass= OrmMetaClass):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)

    # __getattr__: 在对象.属性时,属性没有时触发。
    def __getattr__(self,item):
        # 字典本来的取值方式  字典[key] ---> 字典.key
        return self.get(item)

    # __setattr__: 在对象.属性赋值的时候触发。
    def __setattr__(self,key,value):
        # 字典本身的赋值方式
        self[key] = value

    @classmethod
    def select(cls,**kwargs):
        mysql_obj = mysql_control.Mysql()
        if not kwargs:

            sql= 'select * from %s' % cls.table_name
            res = mysql_obj.select(sql)

        else:
            key = list(kwargs.keys())[0]
            value = kwargs.get(key)
            sql = 'select * from %s where %s=?' % (cls.table_name,key)

            sql = sql.replace('?','%s')
            res = mysql_obj.select(sql,value)

        return [cls(**r) for r in res]

    def save(self):
        mysql = mysql_control.Mysql()

        fields = []
        values = []
        replace = []

        for k,v in self.mappings.items():
            fields.append(k)
            values.append(
                getattr(self,v.name,v.default)
            )
            replace.append('?')

        sql = 'insert into %s(%s) values(%s)' % (self.table_name,','.join(fields),'.join(replace))
        sql = sql.replace('?','%s')
        mysql.execute(sql,values)

    def sql_update(self):
        mysql = mysql_control.Mysql()

        fields = []
        values = []
        primary_key = None

        for k,v in self.mappings.items():

            if v.primary_key:
                primary_key = getattr(self,v.name)

            else :
                fields.append(v.name + '=?')

                values.append(
                    getattr(self,v.name)
                )
        sql = 'update %s set %s where %s=%s' % (self.table_name,self.primary_key,primary_key)
        sql = sql.replace('?',values)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读