วันจันทร์ที่ 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 แล้ว

วันพฤหัสบดีที่ 11 มิถุนายน พ.ศ. 2552

set oracle client for turbogears2

ให้ทำการ download
Oracle Database 10g Express Edition Client
ได้ที่
http://www.oracle.com/technology/software/products/database/xe/htdocs/102xewinsoft.html
มาเพื่อเป็นเหมือนตัวแทน oracle client
ในที่นี้ไว้ที่ drive d: ก็จะได้

D:\XEClient\bin

สามารถเปลี่ยน directory ได้ตามความพอใจครับ

ทำการ set

ORACLE_HOME = D:\XEClient

ได้ที่
คลิ๊กขวาที่
My Computer >> properties >> System Properties >> Advanced
กดปุ่ม
Environment Variables
จะ set ที่ User หรือ System Valiables ก็ได้ครับ

---------------------------
หลังจากนั้น ก็ทำการติดตั้ง cx_Oracle เป็น utility สำหรับ ติดต่อ Oracle สำหรับ python
ไปยัง web
http://cx-oracle.sourceforge.net/
เลือก download ที่:
Windows Installer (Oracle 10g, Python 2.5)

หลังจากนั้นให้ทำการติดตั้ง โดยให้เลือก directory ที่เราเคยติดตั้ง tg2env ครับ
โดย default ตัวติดตั้ง รู้สึกจะไปที่ python25 ให้ทำการเปลี่ยนครับ เพราะเราไม่ได้ทำให้ python
แต่กำลังทำบน environment turbogears2

เมื่อติดตั้งเสร็จ ภายใต้ folder tg2env จะมี cx_Oracle-doc เพิ่มเข้ามา ถ้าลง ผิดก็ลงใหม่ครับ
เมื่อเลือก Install อีกทีมันจะถามว่า จะ Repair หรือ Remove

เมื่อเสร็จแล้วก็ลองเข้าโดย

cd tg2env/Scripts
activate.bat

python
>> import cx_Oracle
>>


ไม่ขึ้น error ก็ใช้ได้ครับ

---------------------------

set ให้ trubogears2 ติดต่อ Oracle Database
ให้แก้ไขที่ file development.ini
ทำการ comment บรรทัดต่อไปนี้ ด้วยเครื่องหมาย # :

#sqlalchemy.url = sqlite:///%(here)s/devdata.db

เพิ่ม บรรทัดนี้เข้าไป :

sqlalchemy.url =oracle://user:password@61.47.7.241:1521/xe


---------------------------

กรณี database set เป็น ascii หรือ อื่น ๆ ที่ไม่ใช่ utf-8
(แต่ถ้าเป็น utf-8 อยู่แล้วก็อาจไม่ต้องทำครับ)
เราจะเป็นต้องเปลี่ยน language oracle เครื่องเราให้อ่านภาษาไทยออก
โดยการ set registry ที่ run พิมพ์:

regedit

จะขึ้น Registry Editor ขึ้นมา เลือกที่

HKEY_LOCAL_MACHINE >> SOFTWARE >> ORACLE >> ??? >> NLS_LANG

ไม่แน่ใจว่า ภายใต้ folder oracle อาจมี sub folder ย่อยไปอีก อาจต้องตามเข้าไปหาในนั้น
เปลี่ยน ค่าใน

NLS_LANG = .UTF8

set ค่าให้กับ turbogears2 ผ่านทาง sqlalchemy เพิ่ม:

sqlalchemy.convert_unicode=True
sqlalchemy.encoding='utf-8'

---------------------------

install turbogears2 on windows

ขั้นตอนแรก ให้ทำการ install python version Python 2.5.4 ก่อนครับ
เนื่องจาก turbogears 2 นั้น run ด้วย python แต่อย่าเกิน version 2.5 ครับ เพราะ ไม่ support

โหลดที่:
http://www.python.org/download/

ทดลองว่าเสร็จแล้วโดยลองพิมพ์:

$ python --version
Python 2.5.4

ทำการ download ez_setup.py โหลดที่:
http://peak.telecommunity.com/dist/ez_setup.py

พิมพ์ command:

$ python ez_setup.py

ทดลองว่าเสร็จแล้วโดยลองพิมพ์:

$ python
>>> import setuptools
>>> setuptools.__version__
'0.6c9'

ในส่วนของ python บน windows ให้ทำการ win32api โหลดที่:
http://starship.python.net/crew/mhammond/win32/
หรือ
http://sourceforge.net/project/showfiles.php?group_id=78018

file น่าจะประมาณนี้ : pywin32-213.win32-py2.5.exe
คือควรเป็น python 2.5 ครับ

เริ่มทำการ create environment โดยพิมพ์

$ easy_install virtualenv

ทำการ download tg2-bootstrap.py โหลดที่:
http://www.turbogears.org/2.0/downloads/current/tg2-bootstrap.py

พิมพ์ command:

python tg2-bootstrap.py --no-site-packages tg2env

---------------------------------------
เริ่มสร้าง project แรก
ในส่วนที่เพิ่งติดตั้งเสร็จไป เข้าไปที่ folder

tg2env/Scripts

พิมพ์ command:

$ activate.bat

ก็จะมี (tg2env) นำหน้า เพื่อให้รู้ว่ามีการ set environment turbogears2 เรียบร้อย

จากนั้น ก็ทำการสร้าง project โดย ไปยัง directory ที่ต้องการวาง project เริ่มด้วยคำสั่ง:

$ paster quickstart app-name

ในที่นี้ใส่ project ชื่อ app-name สามารถเปลี่ยนได้ครับ
จะมีคำสั่งขึ้นว่า

Enter package name [appname]: pkg-name

ในที่นี้ใส่ package ชื่อ pkg-name สามารถเปลี่ยนได้ครับ
จะมีคำสั่งขึ้นว่า

Do you need authentication and authorization in this project? [yes]

ก็กด enter เลยครับ

---------------------------------------
ทดสอบ start project แรก
ในที่นี้ใส่ project ชื่อ app-name ก็เข้าไปยัง folder นี้
หลังจากนั้น

พิมพ์ command:

paster serve development.ini --reload

ในส่วนของ --reload นั้น จะพิมพ์หรือไม่ก็ได้ครับ แต่มีไว้ ก็จะทำให้เกิดการ
restart ทุกครั้งเองที่มีการแก้ไข file ใน project

ในกรณีที่มีการย้าย project ไปยังเครื่องอื่น หรือ มีการเปลี่ยนแปลง env
ให้เข้าไป folder app-name
แล้วใช้คำสั่ง

python setup.py install

หรือ

python setup.py develop

---------------------------------------