使用元类编写一个简单的ORM框架

来源:互联网 发布:大唐软件官网 编辑:程序博客网 时间:2024/05/16 12:13

使用元类编写一个简单的ORM框架

# -*- coding : utf-8 -*-class Field(object):    '''filed'''    def __init__(self, name, column_type):        self.name = name        self.column_type = column_type    def __str__(self):        return '<%s:%s>' % (self.__class__.__name__, self.name)# ------------------class StringField(Field):    '''String Field'''    def __init__(self, name):        super().__init__(name, 'varchar(100)')# ------------------class IntegerField(Field):    '''Integer Field'''    def __init__(self, name):        super().__init__(name, 'bigint')# ------------------class ModelMetaclass(type):    '''meta class'''    def __new__(cls, name, bases, attrs):        if name == 'Model':            return type.__new__(cls, name, bases, attrs)        print('Found Model: %s' % name)        mappings = dict()        for k, v in attrs.items():            if isinstance(v, Field):                print('Found mapping: %s ==> %s' % (k, v))                mappings[k] = v        for k in mappings.keys():            attrs.pop(k)        attrs['__mappings__'] = mappings        attrs['__table__'] = name        return type.__new__(cls, name, bases, attrs)# ------------------class Model(dict, metaclass=ModelMetaclass):    '''model'''    def __init__(self, **kw):        super().__init__(**kw)    def __getattr__(self, key):        try:            return self[key]        except KeyError:            raise AttributeError(r"'Model' object has no attribute '%s'" % key)    def __setattr__(self, key, value):        self[key] = value    def save(self):        fields = []        params = []        args = []        for k, v in self.__mappings__.items():            fields.append(v.name)            params.append('?')            args.append(getattr(self, k, None))        sql = 'insert into %s (%s) values (%s)' % (            self.__table__, ', '.join(fields), ', '.join(params))        print('sql: %s' % sql)        print('args: %s' % str(args))# ------------------class User(Model):    '''user'''    id = IntegerField('id')    name = StringField('name')    email = StringField('email')    password = StringField('password')# ------------------if __name__ == '__main__':    USER = User(id=123, name='Michael',                email='michael@gmail.com', password='my-pwd')    USER.save()

输出结果

[Running] python "d:\git\pythonStudy\hello_world.py"Found Model: UserFound mapping: id ==> <IntegerField:id>Found mapping: name ==> <StringField:name>Found mapping: email ==> <StringField:email>Found mapping: password ==> <StringField:password>sql: insert into User (id, name, email, password) values (?, ?, ?, ?)args: [123, 'Michael', 'michael@gmail.com', 'my-pwd'][Done] exited with code=0 in 0.243 seconds

原文:廖雪峰的Python教程

原创粉丝点击