White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

SQLAlchemy使う(2)


ちょっと進めてみた。今回はマッピングの話。既存のテーブルから自動で読み込む
以下のソースのuser,password,127.0.0.1,dbnameは適宜自分の環境に置き換えてください

model.py

#!/usr/bin/env python
# -*- coding: utf-8-*-
import sqlalchemy
from sqlalchemy.orm import scoped_session, sessionmaker,mapper
from sqlalchemy import MetaData
from sqlalchemy import Column, MetaData, Table, types


class Battery(object):
    pass

def initModel():
    config = {"sqlalchemy.url":"mysql://user:password@127.0.0.1/dbname"}
    engine = sqlalchemy.engine_from_config(config)

    db_session = scoped_session(sessionmaker(autoflush=True, transactional=True,
                            bind=engine))
    metadata = MetaData()

    battery = Table("battery",metadata,
            Column('id', types.Integer, primary_key=True),
            Column('shopname',types.Unicode(32)),
            Column('shopurl',types.Unicode(64)),
            Column('address',types.Unicode(64)),
            Column('mapurl',types.Unicode(64))
            )

    mapper(Battery,battery)
    metadata.create_all(bind=engine)
    return db_session

if __name__ == "main":
    initModel()

これを実行。

$ python
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import model
>>> session = model.initModel()
>>> b = model.Battery()
>>> b.shopname = u"マクド戸塚再開発店"
>>> b.shopurl = u"http://example.com"
>>> session.save(b)
>>> session.commit()

実行結果

あれれー。挿入はできたが文字が化けてる。u""をu"".encodeだかdecodeだかに変えないとだめかなぁ。