设为首页 加入收藏

TOP

十七、PythonSQLAlchemy(十)
2015-11-21 01:40:13 来源: 作者: 【 】 浏览:2
Tags:十七 PythonSQLAlchemy
ails': relation(Email), }) mary = session.query(User).get_by(name='Mary') print mary.emails clear_mappers() # In fact, we don't really need to keep a reference to the mapper object # around at all. Under most circumstances, we can just throw away the # object returned by mapper(). SQLAlchemy keeps track of a data class's # primary mapper behind the scenes, so we don't need to hold a reference # to it. mapper(Email, emails) mapper(User, users, properties={ 'emails': relation(Email), }) mary = session.query(User).get_by(name='Mary') print mary.emails clear_mappers() # Notice that the order in which you create the mappers can be important. # If you want to call relation(), you need to pass it a class that's # already been mapped to a database table, or else SQLAlchemy won't be # able to figure out which table the ForeignKey relationships should refer # to. (Remember: "In the face of ambiguity, refuse the temptation to guess.") try: usermapper = mapper(User, users, properties={ 'emails': relation(Email), }) except exceptions.InvalidRequestError: print "Ignoring the deliberately-provoked error and moving on..." clear_mappers() # What if we also want a "user" property on the Email class? Here's one # way to do it. emailmapper = mapper(Email, emails) # Save the mapper, to use it later usermapper = mapper(User, users, properties={ 'emails': relation(Email), }) # Now that the User mapper has been created, we can use it in a call # to relation() emailmapper.add_property('user', relation(User)) john = session.query(User).get_by(name='John') print john.emails carl_address = session.query(Email).get_by(address='carl@nospam.net') print carl_address.user clear_mappers() # There's a handy "backref" feature that will do the above for you emailmapper = mapper(Email, emails) usermapper = mapper(User, users, properties={ 'emails': relation(Email, backref='user'), }) # No need to call add_property(), it's already been done john = session.query(User).get_by(name='John') print john.emails carl_address = session.query(Email).get_by(address='carl@nospam.net') print carl_address.user clear_mappers() # Order doesn't actually matter when you use backref: you can create the # "one" side of the one-to-many relationship first, or the "many" side of # the one-to-many relationship first, whichever way seems more natural # to you. usermapper = mapper(User, users) emailmapper = mapper(Email, emails, properties={ 'user': relation(User, backref='emails'), }) john = session.query(User).get_by(name='John') print john.emails carl_address = session.query(Email).get_by(address='carl@nospam.net') print carl_address.user clear_mappers() # If you've created a relation(), you can now use object references # instead of object ID's to manage the relationship, and it all works # just like you'd expect it to work. emailmapper = mapper(Email, emails) usermapper = mapper(User, users, properties={ 'emails': relation(Email, backref='user'), }) harry = User(name='Harry', age=47) em1 = Email('harry@nowhere.com') em2 = Email('harry@example.org') em1.user = harry # Properly updates the harry.emails property harry.emails.append(em2) # Properly sets em2.user # Let's prove that harry.emails and em2.user were properly set print em2.user print harry.emails session.save(harry) session.flush() clear_mappers() # Finally, let's demonstr
首页 上一页 7 8 9 10 下一页 尾页 10/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇07-SQLite之like、通配符(%、-、.. 下一篇使用oledb对数据库进行增删改查及..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: