ในส่วนของ 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 แล้ว