ページ

2012年6月13日水曜日

SQLAlchemyのORM


ORM
 - SQLAlchemyでORMを使うためにはbaseクラスを使う方法と、Tableクラスとmapperメソッドを使う方法がある。
  - Tableクラスとmapperメソッドを使う方法は古いやりかたらしい。一応やりかたは以下の通り

from sqlalchemy import Column, Integer, String, Table 
from sqlalchemy.schema import MetaData
from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:', echo=True) # 接続先DBの設定

metadata = MetaData()

my_table = Table("my_table", metadata,
    Column('id', Integer, primary_key=True),
    Column('type', String(50)),
    Column("some_alt", Integer)
)

class MyClass(object):
    pass

mapper(MyClass, my_table, 
    properties={
        'type':my_table.c.type,
        'alt':my_table.c.some_alt
    })

metadata.create_all() # Table作成


  - Tableクラスとmapperメソッドを使ったORMをbaseクラスを使った方法に置き換えると以下のようになる。
    baseクラスを継承したクラスを作成すると、Metadataをメンバに持つクラスを作る事ができる。

from sqlalchemy import Column, Integer, String, Table 
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///:memory:', echo=True) # 接続先DBの設定
Base = declarative_base(bind=engine)

class MyClass(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    type = Column(String(50))
    alt = Column("some_alt", Integer)
 
Base.metadata.create_all(engine) # Table作成

  - またDBへの挿入、更新、参照などをする場合はDB接続のためのSessionオブジェクトとORMを使ってDBの操作を行う。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base(bind=engine)
Session = sessionmaker(bind=engine)
session = Session()

class MyClass(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    type = Column(String(50))
    alt = Column("some_alt", Integer)

Base.metadata.create_all(engine)

myclass = MyClass()
myclass.id = 0
myclass.type = "myclass"
myclass.alt = 10

session.add(myclass) # insertやupdateをするためのデータを持ったORMオブジェクトをセッションに追加
session.commit() # セッション中に存在するORMオブジェクトを使ってinsertもしくはupdateする