วันจันทร์ที่ 29 มิถุนายน พ.ศ. 2552

turbogears 2 and database

project ส่วนใหญ่นั้น จะมีการเก็บข้อมูลไว้เพื่อใช้อ้างอิงหรือออก report จึงทำเป็นต้องมี database เพื่อเก็บข้อมูล
ในส่วนของ turbogears 2 ในบทความนี้ จะใช้ session ครับ โดย tg2 นี้จะเตรียมไว้ให้แล้ว
ใน project/package/model/__init__.py คือ DBSession
คราวนี้ก็มาเตรียม model กัน สิ่งที่ต้องทำสองอย่างคือ

----------------------------------------
setup
----------------------------------------
1. สร้าง class เพื่อจับคู่กับ database

class Model1(object):
  pass

class Model2(object):
  def __init__(self, **kw):
    name = kw.get('name')
    sex = kw.get('sex')

------------------
2. ทำการเขียน mapper ใน def init_model(engine):
from sqlalchemy.types import String, Integer
from sqlalchemy import Sequence
ของ file : project/package/model/__init__.py

  model1_table = Table('model1', metadata, autoload=True, autoload_with=engine)
  mapper(Model1, model1_table)

  model2_table = Table('model2', metadata, Column('id', Integer, Sequence('id_seq'),primary_key=True), useexisting=True, autoload=True, autoload_with=engine)
  mapper(Model2, model2_table)

------------------
3. set database ที่ development.ini เพิ่ม

sqlalchemy.url ={db_name}://{user}:{password}@{db_host}:{db_port}/{db_service_name}


----------------------------------------
query
----------------------------------------
ในส่วนของคำสั่งต่าง ๆ จะอยู่ภายใต้ controller และมี @expose() กำกับบน function ทุกครั้ง
การดึงข้อมูลแบบอ้าง model
------------------
ในส่วนแรกจะเป็นการดึงข้อมูลด้วย Id

model1_model = DBSession.query(Model1).get(1)

------------------
ในส่วนแรกจะเป็นการดึงข้อมูลด้วย name หรือ อื่น ๆ

model2_model = DBSession.query(Model2).filter(Model2.name=='test').first()

------------------
ในส่วนแรกจะเป็นการดึงข้อมูลด้วย name หรือ อื่น ๆ ที่มากกว่า 1 field
from sqlalchemy import and_

model2_model = DBSession.query(Model2).filter(and_(Model2.name=='test', Model2.sex=='male')).first()

------------------
ตัวอย่าง code complex and join

form datetime import datetime
now = datetime.now()
votepoint_model, votejob_model = DBSession.query(VotePoint,VoteJob).filter(
and_( VotePoint.dial_digit_cmdid==kw['dialdigitcmd_model'].id, VotePoint.dial_digitid==kw['dialdigit_model'].id,
VotePoint.vote_jobid==VoteJob.id,
VoteJob.start_dttm<=now,
VoteJob.expire_dttm>=now)
).first()

kw.setdefault('votepoint_model', votepoint_model)
kw.setdefault('votejob_model', votejob_model)

ในที่นี้จะเห็นได้ว่า สามารถนำตัวแปรสองตัวมารับได้เลย ซึ่งสะดวกต่อการใช้งานมาก
------------------
การกระทำข้อมูล ด้วย sql qrery โดยตรง

DBSession.execute("update model1_point set name = 'test2' where id=:id", {'id':1})
DBSession.flush()

ในส่วนของการ flush ก็จะเหมือนการ commit ไปยัง database แล้ว

ไม่มีความคิดเห็น: