[Pylons] SQLAlchemy起步 - IV. Object Relational Mapper


接着前面的例子说,我们定义了book_table和author_table,接下来:
 1  class  Book(object):
 2       def   __init__ (self, title):
 3          self.title  =  title
 4       def   __repr__ (self):
 5           return   " <Book('%s')> "   %  self.title
 6 
 7  class  Author(object):
 8       def   __init__ (self, name):
 9          self.name  =  name
10       def   __repr__ (self):
11           return   " <Author('%s')> "   %  self.name

这里我们定义两个类,继承自object,类似JavaBeans或者POJO,这里的__init__方法和__repr__方法不是必须的,只是为了创建对象和输出对象内容比较方便。然后就可以用SQLAlchemy的mapper和sessionmaker来建立映射关系并处理持久和查询等操作:
 1  from  sqlalchemy.orm  import  mapper,sessionmaker
 2 
 3  mapper(Book, book_table)
 4  mapper(Author, author_table)
 5 
 6  Session  =  sessionmaker(bind = engine)
 7  session  =  Session()
 8 
 9  gia  =  Book(u ' Groovy in Action ' )
10  ag  =  Author(u ' Andrew Glover ' )
11 
12  session.add(gia)
13  session.add(ag)
14  session.add_all([Book( ' Hibernate in Action ' ), Author( ' Gavin King ' )])
15  s_gia  =  session.query(Book).filter_by(title = u ' Groovy in Action ' ).first()
16  s_gia.title  = u' Groovy in Action Updated '
17 
18  print   " [DIRTY] " , session.dirty
19
20  session.commit() # or session.rollback()

如果你用过Hibernate,那么这些代码对你来说,理解起来应该没有任何难度。

假如我告诉你,每次都要像这样先定义Table(schema),再定义class,然后用mapper建立对照,是不是有点那啥?SQLAlchemy的开发者们也意识到这一点,所以从0.5开始,SQLAlchemy可以通过sqlalchemy.ext.declarative支持我们实现更紧凑的model/schema定义:
 1  from  sqlalchemy.schema  import  Table, Column, ForeignKey, Sequence
 2  from  sqlalchemy.types  import   *
 3  from  sqlalchemy.orm  import  relation
 4  from  sqlalchemy.ext.declarative  import  declarative_base
 5 
 6  Base  =  declarative_base()
 7  metadata  =  Base.metadata
 8 
 9  bookauthor_table  =  Table( ' bookauthor ' , metadata,
10      Column( ' book_id ' , Integer, ForeignKey( ' book.id ' ), nullable = False),
11      Column( ' author_id ' , Integer, ForeignKey( ' author.id ' ), nullable = False),
12  )
13 
14  class  Book(Base):
15       __tablename__   =   ' book '
16      id  =  Column(Integer, Sequence( ' seq_pk ' ), primary_key = True)
17      title  =  Column(Unicode( 255 ), nullable = False)
18      authors  =  relation( ' Author ' , secondary = bookauthor_table)
19 
20 
21  class  Author(Base):
22       __tablename__   =   ' author '
23      id  =  Column(Integer, Sequence( ' seq_pk ' ), primary_key = True)
24      name  =  Column(Unicode( 255 ), nullable = False)
25      books  =  relation( ' Book ' , secondary = bookauthor_table)

这里我们用到了many-to-many关系,其他的常见用法还包括many-to-one、one-to-many、JOIN、子查询、EXISTS、Lazy/Eager Load、Cascade (all/delete/delete-orphan)等等,大家可以根据需要查阅官方文档。

你可能感兴趣的:([Pylons] SQLAlchemy起步 - IV. Object Relational Mapper)