Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          接著前面的例子說,我們定義了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

          這里我們定義兩個(gè)類,繼承自object,類似JavaBeans或者POJO,這里的__init__方法和__repr__方法不是必須的,只是為了創(chuàng)建對(duì)象和輸出對(duì)象內(nèi)容比較方便。然后就可以用SQLAlchemy的mapper和sessionmaker來建立映射關(guān)系并處理持久和查詢等操作:
          ?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,那么這些代碼對(duì)你來說,理解起來應(yīng)該沒有任何難度。

          假如我告訴你,每次都要像這樣先定義Table(schema),再定義class,然后用mapper建立對(duì)照,是不是有點(diǎn)那啥?SQLAlchemy的開發(fā)者們也意識(shí)到這一點(diǎn),所以從0.5開始,SQLAlchemy可以通過sqlalchemy.ext.declarative支持我們實(shí)現(xiàn)更緊湊的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關(guān)系,其他的常見用法還包括many-to-one、one-to-many、JOIN、子查詢、EXISTS、Lazy/Eager Load、Cascade (all/delete/delete-orphan)等等,大家可以根據(jù)需要查閱官方文檔。

          主站蜘蛛池模板: 黎平县| 四平市| 广安市| 任丘市| 江陵县| 庄河市| 阿勒泰市| 定结县| 内黄县| 大名县| 拜泉县| 宁蒗| 鹤岗市| 丰县| 和林格尔县| 昭觉县| 贺州市| 三亚市| 海兴县| 永昌县| 泗水县| 莆田市| 揭东县| 庆云县| 五原县| 富宁县| 永寿县| 万州区| 额济纳旗| 化州市| 邢台市| 读书| 云浮市| 花莲县| 马山县| 加查县| 辽阳市| 嘉鱼县| 广东省| 永登县| 靖边县|