def update(self): """ 如果该行的字段属性有 updatable,代表该字段可以被更新 用于定义的表(继承Model的类)是一个 Dict对象,键值会变成实例的属性 所以可以通过属性来判断 用户是否定义了该字段的值 如果有属性, 就使用用户传入的值 如果无属性, 则调用字段对象的 default属性传入 具体见 Field类 的 default 属性 通过的db对象的update接口执行SQL SQL: update `user` set `passwd`=%s,`last_modified`=%s,`name`=%s where id=%s, ARGS: (u'******', 1441878476.202391, u'Michael', 10190 """ self.pre_update and self.pre_update() L = [] args = [] for k, v in self.__mappings__.iteritems(): if v.updatable: if hasattr(self, k): arg = getattr(self, k) else: arg = v.default setattr(self, k, arg) L.append('`%s`=?' % k) args.append(arg) pk = self.__primary_key__.name args.append(getattr(self, pk)) dbHandler.update('update `%s` set %s where %s=?' % (self.__table__, ','.join(L), pk), *args) return self
def delete(self): """ 通过db对象的 update接口 执行SQL SQL: delete from `user` where `id`=%s, ARGS: (10190,) """ self.pre_delete and self.pre_delete() pk = self.__primary_key__.name args = (getattr(self, pk),) dbHandler.update('delete from `%s` where `%s`=?' % (self.__table__, pk), *args) return self
class BlobField(Field): """ 保存Blob类型字段的属性 """ def __init__(self, **kw): if 'default' not in kw: kw['default'] = '' if 'ddl' not in kw: kw['ddl'] = 'blob' super(BlobField, self).__init__(**kw) class VersionField(Field): """ 保存Version类型字段的属性 """ def __init__(self, name=None): super(VersionField, self).__init__(name=name, default=0, ddl='bigint') if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) dbHandler.create_engine('root', '123456', 'test', '127.0.0.1') dbHandler.update('drop table if exists user') dbHandler.update('create table user (id int primary key, name text, email text, passwd text, last_modified real)') import doctest doctest.testmod()