Discuss / Python / 稍微精简了一下

稍微精简了一下

Topic source
class Field(object):
    def __init__(self, name, type):
        self.name, self.type = name, type

class StringField(Field):
    def __init__(self, name):
        super().__init__(name, 'sql-string')

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

class ModelMetaclass(type):
    def __new__(cls, name, bases, attrs):
        mappings=dict()
        for k,v in attrs.items(): # 将需要保存的表转为 Name-Object 形式储存在 Mappings 中
            if isinstance(v, Field): mappings[k]=v
        for k in mappings.keys(): attrs.pop(k) # 实例对象不需要 Name 属性
        attrs['__table__']=name
        attrs['__mappings__']=mappings
        return type.__new__(cls, name, bases, attrs)

class Model(dict, metaclass=ModelMetaclass):
    def save(self):
        fields, args = [],[]
        for k, v in self.__mappings__.items(): # eg. k=id v=FieldObj v.name=uid self[k]=12345
            print(f'{k} => {v.type} => {v.name} = {self[k]}')
            fields.append(v.name)
            args.append(self[k])
        print('SQL: %s\nARGS: %s' % ('insert into %s (%s)' % (self.__table__, ','.join(fields)), str(args)))

class User(Model):
    id = IntegerField('uid')
    name = StringField('username')
    email = StringField('email')
    password = StringField('password')

u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd', others='wrong-text')
u.save()

  • 1

Reply