-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathorm_1.py
More file actions
63 lines (43 loc) · 1.63 KB
/
orm_1.py
File metadata and controls
63 lines (43 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Field(object):
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):
def __init__(self, name):
super(StringField, self).__init__(name, 'varchar(100)')
class IntegerField(Field):
def __init__(self, name):
super(IntegerField, self).__init__(name, 'bigint')
class ModelMetaClass(type):
def __new__(mcs, name, base, dct):
if name == 'Model':
super(ModelMetaClass, mcs).__new__(mcs, name, base, dct)
attr = ((key, value) for key, value in dct.items() if isinstance(value, Field))
mapping = dict((key, value) for key, value in attr)
for k in mapping.keys():
dct.pop(k)
dct['__table__'] = name.lower()
dct['__mapping__'] = mapping
return super(ModelMetaClass, mcs).__new__(mcs, name, base, dct)
class Model(dict, metaclass=ModelMetaClass):
def __init__(self, **kwargs):
super(Model, self).__init__(**kwargs)
def __getattr__(self, item):
return self[item]
def save(self):
field = []
args = []
for k, v in self.__mapping__.items():
field.append(v.name)
args.append(getattr(self, k))
print(field, args)
class User(Model):
id = IntegerField('id')
name = StringField('name')