python ORM

1)为什么要用ORM

常规情况我们通过pymysql进行mysql数据库的操作,但是这个操作有一定的局限。
1、使用pymysql必须要返回mysql
2、使用原生的sql语句嵌套的python脚本当中,本身就不合适。
所以有了ORM(数据库映射关系),将python的数据类型和对象转换为mysql的数据类型和对象。可以通过python语句操作mysql。

2)工作原理

1、ORM借助元类进行创建
2、python可以动态创建类,创建类的类就是元类。
3、type除了返回类型还可以返回类对象,就是创建类对象

3)type元类介绍

type是一种特殊的元类
1、type只传入一个参数,返回参数的类型(即常用的检测对象类型)
2、type传入三个参数,创建类对象

t = type('hello', (), {'a':1})
print(t)
T = t()
print(T.a)

第一个参数是 类名称,要用字符串
第二个参数是 继承对象,要用元组,单元素元组要加,
第三个参数是 属性,以字典的格式,键属性名 值属性值

4)ORM框架

import pymysql

class Field(object):

    def __init__(self,name,column_type):
        self.name = name
        self.column_type = column_type

    def __str__(self):
        return '<%s:%s>' %(self.name,self.column_type)

class StringField(Field):
    def __init__(self,name):
        super().__init__(name,'varchar(100)')

class IntegerField(Field):
    def __init__(self,name):
        super(IntegerField, self).__init__(name,'int')

class ModelMetaClass(type):
    def __new__(cls, name, bases, attrs):
        if name == 'Model':
            return type.__new__(cls, name, bases, attrs)
        mapping = dict()
        #k是字符串,v是地址
        for k,v in attrs.items():
            if isinstance(v, Field):
                mapping[k] = v
        for k in mapping.keys():
            attrs.pop(k)
        attrs['__mapping__'] = mapping
        attrs['__table__'] = name
        return type.__new__(cls, name, bases, attrs)

class Model(dict, metaclass=ModelMetaClass):
    def __init__(self, **kwargs):
    	#连接数据库创建游标
        self.db = pymysql.connect(
            host='地址',
            user='用户名',
            password='密码',
            database='要连接的数据库'
        )
        self.cursor = self.db.cursor()
        super(Model, self).__init__(**kwargs)

    def __getattr__(self, key):
        # print(self)
        return self[key]

    def __setattr__(self, key, value):
        self[key] = value

    def save(self):
        fields = []
        args = []
        for k,v in self.__mapping__.items():
            # print(k,v)
            fields.append(v.name)
            # print(2,fields)
            args.append(getattr(self, k, None))
            print(1,args)
            #sql语句的创建时执行
            sql = 'insert into %s(%s) value(%s)'%(
                self.__table__,
                ','.join(fields),
                ','.join([repr(str(i)) for i in args])
            )
        self.cursor.execute(sql)
        # print(sql)


    def __del__(self):
    	#在内存回收之前提交操作并关闭数据库连接
        self.db.commit()
        self.cursor.close()
        self.db.close()

class stu1(Model):
    id = IntegerField('id')
    name = StringField('name')
    age = IntegerField('age')

u = stu1(id = 2, name = "老边",age = 18)
u.save()

5)学习ORM的建议

1、了解type的用法
2、善于利用debug;一定要动手练几遍,在不懂的地方写几个print看什么时候会输出,了解其执行顺序
3、不能只看,看不懂就不练,要多练,练中学,学中练

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值