Read Sean

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

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

          Posted on 2009-01-27 12:52 laogao 閱讀(1702) 評論(0)  編輯  收藏 所屬分類: On Python

          接著前面的例子說,我們定義了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)等等,大家可以根據需要查閱官方文檔。

          主站蜘蛛池模板: 蕲春县| 雷波县| 晋中市| 寻甸| 定日县| 驻马店市| 阿荣旗| 苍溪县| 策勒县| 安丘市| 通海县| 焉耆| 绵阳市| 长寿区| 崇左市| 洛扎县| 河西区| 磐石市| 宿迁市| 淮滨县| 大邑县| 保山市| 兴安县| 溧阳市| 内丘县| 舒兰市| 三门县| 玛纳斯县| 曲周县| 津南区| 霞浦县| 龙泉市| 凭祥市| 东乌珠穆沁旗| 乳山市| 甘孜县| 武功县| 枣庄市| 织金县| 塘沽区| 彭阳县|