<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1691) 評論(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)等等,大家可以根據需要查閱官方文檔。

    主站蜘蛛池模板: 亚洲免费视频一区二区三区| 亚洲黄色免费网址| 成人精品视频99在线观看免费| 国产亚洲一区二区三区在线观看| 久9这里精品免费视频| 亚洲免费观看在线视频| 国产美女无遮挡免费网站| 一级午夜免费视频| 亚洲午夜在线电影| 国产视频精品免费| 日本人成在线视频免费播放| 67194在线午夜亚洲| 亚洲人成网站观看在线播放| 一区二区三区观看免费中文视频在线播放 | 亚洲欧洲日韩极速播放| 亚洲国产av一区二区三区| 女人体1963午夜免费视频| 亚洲色大情网站www| 亚洲va久久久噜噜噜久久男同| 最近2019中文字幕免费看最新| 国产三级在线免费观看| 亚洲精品二三区伊人久久| 夜夜春亚洲嫩草影院| 成年女人毛片免费播放人| 久久国产精品免费一区| 国产精品亚洲自在线播放页码| 中文字幕无码精品亚洲资源网| 日韩精品成人无码专区免费| 国产精品hd免费观看| 亚洲人成网站在线在线观看| 亚洲第一区香蕉_国产a| 亚洲国产成人影院播放| 日韩精品成人无码专区免费| 国产一级片免费看| 免费国产va在线观看| 香蕉大伊亚洲人在线观看| 亚洲精品在线观看视频| 亚洲第一视频在线观看免费| 黄在线观看www免费看| 久久免费美女视频| a级毛片免费观看网站|