这其实并不是一个新的方法,它只是在 SQLAlchemy 中没有谈到罢了。它在 mapping/__init__.py 中。在 SQLAlchemy 的邮件列表中我对于 Table Metadata , User-defined class, Mapper 三者之间的关系产生了疑问,我认为 User-defined Class 作为 ORM 的主要承载者,它的功能似乎有些太简单了,没有特殊的基类,没有与某个 mapper 自动绑定,甚至需要我手工写,User.mapper = mapper(User, users),这样才把一个 mapper 与一个类相绑定,但使用时也不得不用 User.mapper 的方法。其实这一切都不需要这样,  SQLAlchemy 已经提供了一个非常方便的方法,那就是:

assign_mapper

它与一般的 mapper 没有什么区别,但却多做了一些与类绑定有关的工作,解决了我上面的不满。

它的代码也很简单,如:

def assign_mapper(class_, *args, **params):
    params.setdefault("is_primary", True)
    m = mapper(class_, *args, **params)
    class_.mapper = m
    class_.get = m.get
    class_.select = m.select
    class_.select_by = m.select_by
    class_.selectone = m.selectone
    class_.get_by = m.get_by
    def commit(self):
        objectstore.commit(self)
    def delete(self):
        objectstore.delete(self)
    class_.commit = commit
    class_.delete = delete

看到了吧,我可以直接从类上直接调用绑定的 mapper 的方法了,而且象 objectstore 的 commit(), delete() 方法也可以直接使用了。这样真是太方便了。调用与 mapper 方式一样,而且更简单:

assign_mapper(User, users)


评论

该日志第一篇评论

发表评论

评论也有版权!

click to change验证码