用Metaclass实现一个精简的ORM框架

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-30 09:13   11   0

存档:

 1 # -*- coding: utf-8 -*-
 2 class Field(object):
 3 
 4     def __init__(self, name, column_type):
 5         self.name = name
 6         self.column_type = column_type
 7 
 8     def __str__(self):
 9         return '<%s:%s>' % (self.__class__.__name__, self.name)
10 class StringField(Field):
11 
12     def __init__(self, name):
13         super(StringField, self).__init__(name, 'varchar(100)')
14 
15 class IntegerField(Field):
16 
17     def __init__(self, name):
18         super(IntegerField, self).__init__(name, 'bigint')
19 class ModelMetaclass(type):
20 
21     def __new__(cls, name, bases, attrs):
22         if name=='Model':
23             return type.__new__(cls, name, bases, attrs)
24         print('Found model: %s' % name)
25         mappings = dict()
26         for k, v in attrs.items():
27             if isinstance(v, Field):
28                 print('Found mapping: %s ==> %s' % (k, v))
29                 mappings[k] = v
30         for k in mappings.keys():
31             attrs.pop(k)
32         attrs['__mappings__'] = mappings # 保存属性和列的映射关系
33         attrs['__table__'] = name #;">Michael', email='test@orm.org', password='my-pwd')
68 # 保存到数据库:
69 u.save()

结果如下:

Found model: User
Found mapping: id ==> <IntegerField:id>
Found mapping: name ==> <StringField:username>
Found mapping: email ==> <StringField:email>
Found mapping: password ==> <StringField:password>
SQL: insert into User (id,username,email,password) values (?,?,?,?)
ARGS: [12345, 'Michael', 'test@orm.org', 'my-pwd']
[Finished in 0.2s]

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP