这其实并不是一个新的方法,它只是在 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)



发表评论