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

    主站蜘蛛池模板: 久久亚洲2019中文字幕| 亚洲精品国产自在久久| 亚洲电影免费观看| 免费萌白酱国产一区二区三区| 亚洲一区二区三区乱码A| 一级毛片aa高清免费观看| 亚洲综合av永久无码精品一区二区| jizz在线免费播放| 亚洲色偷偷偷鲁综合| 无码av免费网站| 亚洲的天堂av无码| 一个人看的www在线观看免费| 最新亚洲春色Av无码专区| 波多野结衣久久高清免费 | 亚洲国产aⅴ成人精品无吗| 嫩草影院免费观看| 免费VA在线观看无码| 亚洲日韩v无码中文字幕| 91av在线免费视频| 中文字幕亚洲综合久久综合| 日本免费一本天堂在线| 国产免费黄色无码视频| 久久亚洲免费视频| 最近2019中文字幕免费看最新| 亚洲国产精品自在自线观看| 亚洲精品黄色视频在线观看免费资源 | 亚洲精品V欧洲精品V日韩精品| 久久久久久免费一区二区三区 | 亚欧洲精品在线视频免费观看| 久久久久久a亚洲欧洲AV| 在线观看日本免费a∨视频| 羞羞漫画页面免费入口欢迎你| 国产精品亚洲一区二区三区在线| 免费成人福利视频| 精品一区二区三区无码免费直播| 亚洲av无码一区二区三区乱子伦| 无人在线观看完整免费版视频 | 亚洲同性男gay网站在线观看| 国产一区二区三区在线免费| 日韩视频免费在线观看| 亚洲av永久无码精品秋霞电影秋|