实用:python中的ORM对象关系映射

本文详细介绍了Python中的ORM对象关系映射技术,通过一系列改进,包括增加会话功能、元类的使用、引擎的引入等,逐步展示了如何在实践中优化数据库操作。每个改进都伴随着运行结果展示,读者可以清晰地看到数据库的变化,从而深入理解ORM的工作原理。
摘要由CSDN通过智能技术生成
class Field:
    def __init__(self, name=None, fieldname=None, pk=False, unique=False, default=False, nullable=True, index=False):
        self.name = name
        self.fieldname = fieldname
        self.pk = pk
        self.unique = unique
        self.default = default
        self.nullable = nullable
        self.index = index

    def validate(self, value):
        raise NotImplementedError

    def __get__(self, instance, owner):
        if instance is None:
            return self
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        self.validate(value)
        instance.__dict__[self.name] = value

    def __str__(self):
        return '<{} {}>'.format(self.__class__.__name__,self.name)

    __repr__ = __str__

class IntField(Field):
    def __init__(self, name=None, fieldname=None, pk=False, unique=False, default=False, nullable=True, index=False,auto_increment=False):
        self.auto_increment = auto_increment
        super().__init__(name, fieldname, pk, unique, default, nullable, index)

    def validate(self, value):
        if value is None:
            if self.pk:
                raise TypeError('{} = {} error!!'.format(self.name, value))
            if not self.nullable:
                raise TypeError('{} = {} error!!'.format(self.name, value))
        else:
            if not isinstance(value, int):
                raise TypeError('{} = {} error!!'.format(self.name, value))

class StringField(Field):
    def __init__(self,length=32,name=None, fieldname=None,pk=False,unique=False,default=False,nullable=True,index=False,auto_increment=False):
        self.length = length
        super().__init__(name,fieldname,pk,unique,default,nullable,index)

    def validate(self,value):
        if value is None:
            if self.pk:
                raise TypeError('{} = {} error!!'.format(self.name,value))
            if not self.nullable:
                raise TypeError('{} = {} error!!'.format(self.name,value))
        else:
            if not isinstance(value,str):
                raise TypeError('{} = {} error!!'.format(self.name,value))
            if len(value) > self.length:
                raise ValueError('{} is too long,value={}'.format(self.name,value))

class Student:
    id = IntField('id')
    name = StringField(24,'name')

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

s = Student(1,name='tom')
print(s.id,s.name)

运行结果:

1 tom

改进:

import pymysql

class Field:
    def __init__(self, name=None, fieldname=None, pk=False, unique=False, default=False, nullable=True, index=False):
        self.name = name
        self.fieldname = fieldname
        self.pk = pk
        self.unique = unique
        self.default = default
        self.nullable = nullable
        self.index = index

    def validate(self, value):
        raise NotImplementedError

    def __get__(self, instance, owner):
        if isinstance is None:
            return self
        return instance.__class__.__name__,instance.__dict__[self.name],self.__dict__

    def __set__(self, instance, value):
        self.validate(value)
        instance.__dict__[self.name] = value

    def __str__(self):
        return '<{} {}>'.format(self.__class__.__name__,self.name)

    __repr__ = __str__

class IntField(Field):
    def __init__(self, name=None, fieldname=None, pk=False, unique=False, default=False, nullable=True, index=False,auto_increment=False):
        self.auto_increment = auto_increment
        super().__init__(name, fieldname, pk, unique, default, nullable, index)

    def validate(self, value):
        if value is None:
            if self.pk:
                raise TypeError('{} = {} error!!'.format(self.name, value))
            if not self.nullable:
                raise TypeError('{} = {} error!!'.format(self.name, value))
        else:
            if not isinstance(value, int):
                raise TypeError('{} = {} error!!'.format(self.name, value))

class StringField(Field):
    def __init__(self,length=32,name=None, fieldname=None,pk=False,unique=False,default=False,nullable=True,index=False,auto_increment=False):
        self.length = length
        super().__init__(name,fieldname,pk,unique,default,nullable,index)

    def validate(self,value):
        if value is None:
            if self.pk:
                raise TypeError('{} = {} error!!'.format(self.name,value))
            if not self.nullable:
                raise TypeError('{} = {} error!!'.format(self.name,value))
        else:
            if not isinstance(value,str):
                raise TypeError('{} = {} error!!'.format(self.name,value))
            if len(value) > self.length:
                raise ValueError('{} is too long,value={}'.format(self.name,value))

class Student:
    id = IntField('id')
    name = StringField(24,'name')
    age = IntField('age')

    def __init__(self,id,name,age=18):
        self.id = id
        self.name = name
        self.age = age

    def save(self,conn:pymysql.connections.Connection):
        #连接数据库
        #cursor execute(sql)
        sql = 'insert into t(id,name,age) values(%s,%s,%s);'
        try:
            with conn as cursor:
                with cursor:
                    line = cursor.execute(sql,(self.id,self.name,self.age))
                    conn.commit()
        except:
            conn.rollback()

#连接数据库
conn = pymysql.connect('172.20.10.11','root','123456','test')
s = Student(1,'haha',27)
s.save(conn)

#返回表名+字段值+字段定义
print(s.id)
print(s.name)
print(s.age)

运行结果:

('Student', 1, {'auto_increment': False, 'unique': False, 'default': False, 'fieldname': None, 'index': False, 'name': 'id', 'pk': False, 'nullable': True})
('Student', 'haha', {'unique': False, 'default': False, 'fieldname': None, 'index': False, 'name': 'name', 'pk': False, 'length': 24, 'nullable': True})
('Student', 27, {'auto_increment': False, 'unique': False, 'default': False, 'fieldname': None, 'index': False, 'name': '
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值