Displaying articles with tag database

RailsDB

Posted by PunNeng, Wed May 28 02:46:00 UTC 2008

ทุกชิ้นงาน(ของออฟฟิศ)ที่ผมทำบน rails อยู่ทุกวันนี้ host ด้วย vps ครับ แล้วตอนติดตั้ง ก็ขี้เกียจติดตั้งชุดแปล php ด้วย ผมเลยอยากได้อะไรเหมือน phpmyadmin ครับ
ทางเลือกแรก ต้องใช้ edge rails
มีตัวช่วยใหม่ ชื่อว่า dbconsole แต่ก็ยังเป็น command line แค่มัน remote ให้ แค่นั้นเอง
ทางเลือกที่สองก็คือ RailsDB
ทางเลือกที่สาม เอ่อ.. ช่วย comment บอกที

ย้อนกลับมาที่ RailsDB ครับ น่าจะใช้แทน phpmyadmin ได้มากที่สุด คืนนี้ ผมก็เลยลองซะ ผลที่ได้คือ error!!(เป็นปกติ)

มันพังเพราะ default config มันผิด ตอนต่อ db หน้าตาประมาณนี้

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
def switch_db( database )     
    case database.driver.name
      when 'sqlite3'
        ActiveRecord::Base.establish_connection(
          :adapter  => 'sqlite3',
          :database => database.path
        )
      when 'mysql'
        ActiveRecord::Base.establish_connection(
          :adapter  => 'mysql',
          :database => database.name,
          :host     => database.host,
          :username => database.username,
          :password => database.password
        )
      when 'postgresql'
        ActiveRecord::Base.establish_connection(
          :adapter  => 'postgresql',
          :database => database.name,
          :host     => database.host,
          :username => database.username,
          :password => database.password
        )
    end
  end

code ชุดนี้ อยู่ที่ app/models/switch.rb ครับ
สังเกตได้ว่า มันไม่มี port หรือ socket ให้กรอกครับ ค่า default ของ mysql ใน activerecord เองก็กำหนดไว้ว่า port เป็น 3306 และ socket เป็น /tmp/mysql.sock

วิธีซ่อมก็ง่ายๆ ครับ ใส่่ port หรือ socket ที่ถูกต้องเข้าไป

ประชาสัมพันธ์หน่อยครับ
มีงาน train (J)Ruby on Rails ของ narisa นะครับ ใครสนใจก็ตาม link ข้างล่างเลย
วันจัด train เรื่อง (J)Ruby On Rails ครับ - Narisa.com

3 comments | Filed Under: Ruby on Rails | Tags: database

SQLite Database Browser

Posted by PunNeng, Mon May 14 13:31:00 UTC 2007

หลังจากที่วนเวียนหา sqlite browser บน mac(ที่ฟรี) ที่มานาน แล้วก็มาเจอ SQLite Database Browser นี่แหละ ฟัดเหวี่ยงได้ดีทีเดียว

หน้าตาก็ประมาณโปรแกรม spreadsheet ทั้งหลาย เป็นตารางๆ ดูง่าย สบายตา มาดู feature อื่นๆ

  • Create and compact database files
  • Create, define, modify and delete tables
  • Create, define and delete indexes
  • Browse, edit, add and delete records
  • Search records
  • Import and export records as text
  • Import and export tables from/to CSV files
  • Import and export databases from/to SQL dump files
  • Issue SQL queries and inspect the results
  • Examine a log of all SQL commands issued by the application

มันอาจจะใช้ sql command ที่เรากรอกเองไม่ได้ ต้องใช้ user interface ของมันอย่างเดียว แต่สำหรับผม ก็น่าพอใจทีเดียว เพราะทำงานกับ Rails ส่วนใหญ่ใช้ Migration ตลอด ไม่ค่อยได้มายุ่งอะไรกับ sql command มากนัก ผมชอบแบบนี้มากก่า เพราะจำ sql command ไม่ค่อยได้เลย

มันรองรับได้ทั้ง Linux, OS X และ Windows รองรับทั้ง 3 platform หลัก แต่บน platform อื่น อย่าง linux หรือ windows ก็คิดว่าน่าจะมี tools ที่ฟรี และดีกว่านี้ :)

0 comments | Filed Under: | Tags: database

Persistent connection in MySql

Posted by PunNeng, Tue Feb 27 17:38:00 UTC 2007

...บ่นไปที่โพสอันก่อนอยู่แหม็บๆ วันนี้มาพูดถึงเรื่อง persistent connection ใน mysql ละ

ปกติที่เราเขียนติดต่อ mysql กัน เชื่อเหอะ ส่วนใหญ่จะใช้ mysql_connect กันทั้งนั้นแหละ ซึ่งการใช้ฟังก์ชั่นนี้ มันจะ connect เข้า mysql ทุกครั้งที่มีการรันไฟล์ php นั้น ก็คิดดูเอาว่าถ้ามี pageviews ประมาณ 5 พันต่อวัน ก็ต้องมีการ connect เกิดขึ้น 5 พันครั้งต่อวัน เลยทีเดียว

mysql_pconnect() เป็นการสั่งให้ใช้ persistent connection ซึ่งเป็น connection ที่เปิดตลอดเวลา (connect ทีเดียว แล้ว connection นั้นจะค้างไปตลอด) ถ้าเว็บของเรามีคนเข้าตลอดทั้งวันทั้งคืน การใช้ pconnect จะช่วยให้ลดการ connect เข้า mysql ได้โขเลยทีเดียว ซึ่งทำใหเว็บของเราเร็วขึ้นอีก

connection ของ pconnect จะค้างไว้นานเท่าไหร่ ขึ้นอยู่กับการกำหนดค่า wait_timeout ใน mysql ซึ่งปกติจะอยู่ที่ 8 ชั่วโมง (ใครเปิดด้วย connect() แล้วไม่ปิด ระวัง เหอๆ) ถ้าภายใน 8 ชั่วโมง ไม่มีการเรียก pconnect() อีก connection นั้นก็จะถูกปิดไป แต่ถ้าก่อนหน้านั้นมีการเรียก pconnect ก็จะใช้ connection เดิมนั่นแหละ เร็วดี

ของดีแบบนี้ ไม่ใช้ ก็กระไรอยู่ใช่มั้ยครับ

... ฮ่าๆ คิดผิดถนัด อย่าลืมว่า process การ request ของ client เนี่ย จะ handle จาก apache process ซึ่ง apache process จะอยู่นานเท่าไหร่ ขึ้นอยู่กับ timeout ของ apache ด้วย ซึ่งปกติจะอยู่ที่ 300 วินาที พอ apache process มัน timeout ไปแล้ว persistent connection ที่ apache process นั้น handle อยู่ ก็จะเคว้งคว้าง กลายเป็นผีไร้ศาล (ถ้าค้างมากๆ ก็จะเกิน max_connections ซะอีก) แล้ว persistent connection นั้นก็จะค้างเติ่งอยู่จนกว่าจะถึง timeout ของ mysql

ฉะนั้น ทางแก้ก็คือ แก้ wait_timeout ของ mysql ให้ใกล้เคียงกับ apache timeout ด้วย จะได้ไม่มีผีจนล้น server

คำเตือน : shared host ควรดู wait_timeout ของ mysql ก่อนตัดสินใจใช้ pconnect ทุกครั้ง เดี๋ยวจะกลายเป็นว่า pconnect สร้างปัญหามากกว่าเดิม

0 comments | Filed Under: General | Tags: database

เล่นไป บ่นไป : MySql

Posted by PunNeng, Sun Feb 25 00:06:00 UTC 2007

AMp เขียนครับ

...อุตส่าห์หลงปลื้ม mysql ตั้งนานว่าทั้งฟรีทั้งดี แถมยังเป็นรองแค่ oracle อีกต่างหาก (ใน whitepaper ที่ mysql อวดไว้) สงสัยผมคงต้องคิดใหม่ละ เพราะยิ่งเล่น ก็ยิ่งรู้สึกว่ามันตันๆ ในหลายๆ อย่าง ทั้งในเรื่องการใช้งานและประสิทธิภาพ (หรือผมใช้งานมันผิดประเภทหว่า?)

- mysql ไม่มี session temporary table ใครที่เคยเล่น mssql จะรู้ว่ามันสามารถทำ #table ที่เป็น session temporary table ได้ ทำให้การ process งานใน store ทำได้คล่องตัวมาก เพราะ session temporary table นี้มันจะเห็นและใช้งานได้เฉพาะ connection นั้นๆ ไม่เกี่ยวกับ connection อื่นๆ ต่างกับ mysql ที่ถึงแม้จะมี memory engine แต่ก็ต้องสร้างรอไว้ ไม่สามารถสร้างแยกตาม connection ได้ ถ้า mysql มี #table ล่ะก็ น่าจะมันส์ขึ้นอีกเยอะ

- mysql เปราะจริงๆ เนื่องจากผมเห็นมันโฆษณาว่าเป็นรองแค่ oracle ก็เลยลองซะหน่อย ทำ select แบบ cross join กับข้อมูล 5 ล้านเรคอร์ด ... ผลน่ะหรอ .... เครื่องแทบค้าง อันนี้เป็นเพราะว่าเครื่องผมไม่แรงพอ แต่พอผมปิด process ของ mysql แล้วเปิดใหม่อีกรอบเท่านั้นแหละ ... แม่เจ้าาา ... DB ที่ใช้ทดสอบพังไปเลย เข้าใช้งานไม่ได้อีกเลยครับ แล้วแบบนี้ ถ้าใช้ๆ งานอยู่ แล้วเครื่องค้างขึ้นมา มิซวยแย่หรอเนี่ย - -'

- stored procedure ยังพัฒนาไม่เต็มที่? ปกติถ้าเขียน sp (ย่อจาก stored procedure) มันจะช่วยให้ query ได้เร็วขึ้น เพราะมีการทำ execution plan ไว้ตั้งแต่ตอน compile sp แล้ว แถมไม่ต้องเสียเวลาขนข้อมูลไปๆ มาๆ ระหว่าง client ด้วย แต่ที่ผมลองกับ process การคำนวนเรื่องความใกล้เคียงของกล้องดิจิตอลที่ใช้งานจริงใน focusshot.com มันกลับอืดยิ่งกว่าเดิมซะอีก แถมเล่นซะเครื่องแทบค้าง ทั้งๆ ที่ก่อนหน้านี้ process นี้เขียนด้วย php ก็รันได้ปกติ ไม่ถึงกับทำให้เครื่องค้างแต่อย่างใด (แค่อืดเล็กน้อย) ตอนนี้ชักเริ่มสงสัยละว่าเป็นที่ผมเขียนไม่ดี หรือว่า sp ใน mysql ยังพัฒนาไม่เต็มที่กันแน่ (ตอนเครื่องค้างขณะรัน sp ที่ว่านี้ ผมก็ปิด process ด้วยการเรียก stop service ตามที่มันควรจะเป็น (คราวที่แล้วปิดถึกๆ ด้วย task manager) ปรากฏว่า DB ก็พังเหมือนเดิม เวรจริงๆ - แต่บางทีก็ไม่พัง เสี่ยงดวงเอา)

- อยากได้ tool ของ mysql อย่าง ms query analyzer จัง ทีแรกก็ไม่ได้คิดอะไรหรอกครับ เรื่อง tool ของ mysql เนี่ย มีให้ใช้ฟรีๆ ก็ใช้ไปเหอะ แต่พอได้เล่น query analyzer ของ mssql แล้ว ก็รู้สึกว่า มันใช้งานได้คล่องดี คีย์ลัดก็ไม่ต้องกดมาก ในขณะที่ tool ทางฝั่ง mysql กว่าจะเขียนโค้ด กว่าจะรัน ไม่ทันกินจริงๆ (navicat ถ้าจะรัน selected command ต้องกด ctrl+shift+r ... ทำไมมันไม่ทำให้กด F5 เหมือน query analyzer ฟะ กดบ่อยๆ เมื่อยมือนะเนี่ย - -*)

...ก็นะ ถึงจะบ่นๆ แต่ก็ใช้ mysql ต่อปายยย เหอๆ

ป.ล. หลังจากที่บ่นไปข้างบนแล้ว ก็ลองไปเขียน process คำนวณความใกล้เคียงใหม่อีกรอบ คราวนี้ใช้ TActiveRecord ของ Prado ปรากฏว่า ทำงานได้ช้ามากๆ (แต่เครื่องไม่ค้าง) ข้อมูล 1.2 ล้านเรคอร์ด คาดว่าน่าจะใช้เวลาเกิน 1 ชั่วโมง ก็เลยจำใจ ต้องเล่นบทไถนา เขียนด้วย native php เหมือนเดิม ปรากฏว่าใช้เวลาไม่ถึง 10 นาที (ไม่กล้าเอาไปรันที่โฮสจริงเลย ให้ตายดิ - -')

ป.ล.2 กลับมาคิดๆ เรื่อง sp ใน mysql ที่เล่นซะเครื่องค้าง อาจจะเป็นไปได้ว่า sp เร็วจริง ไม่มี bottle neck เรื่อง network เข้ามาเกี่ยว ก็เลยสูบ cpu ได้เต็มที่ แต่ cpu รับไม่ไหว เลยกลายเป็นว่า เครื่องค้าง และทำงานช้ากว่าเดิม

ป.ล.3 ตอนนี้ focusshot.com เป็นผีไร้ศาลอยู่ครับ ไหนๆ ก็ไม่มีศาลละ เลยนั่งทำใหม่ด้วย prado ซะเลย

0 comments | Filed Under: General | Tags: database

SQLite3 on Rails

Posted by PunNeng, Sun Feb 18 23:08:00 UTC 2007

ทุกวันนี้ผมทำงานกับ Rails โดยใช้ SQLite3 เป็น database แทน MySQL ในขณะที่กำลังพัฒนา และ test ก่อนที่จะเอาไป deploy ใช้กับ MySQL อีกทีตอนที่ใช้งานจริงๆ
เนื่องจากมันเบา จึงเร็ว ติดตั้งง่าย ไม่มี config เยอะมากมาย ผมว่ามันสะดวกดี ตอนที่เรากำลังกำลังพัฒนางานๆ นึงอยู่

วิธีติดตั้งก็ไม่ยากเย็นเลย มาดูฝั่ง Mac กันก่อน ให้ติดตั้งผ่าน darwinport นะครับ จะสะดวกมาก โดยไปที่ terminal แล้วพิมพ์ว่า

$ sudo port install rb-sqlite3

แล้วก็รอมันทำจนเสร็จ สำหรับฝั่ง linux ผมใช้ Ubuntu ครับ มี apt-get อยู่แล้ว สบายหายห่วง แค่พิมพ์ใน terminal ว่า

$ apt-get install sqlite3 swig libsqlite3-ruby libsqlite3-dev
gem install sqlite3-ruby

สำหรับฝั่ง Windows ก็ไม่ยาก เพียง download สองตัวนี้ http://www.sqlite.org/sqlite-327.zip http://www.sqlite.org/sqlitedll-327.zip extract แล้วเอาไปไว้ใน /WINDOWS/system32 จากนั้นพิมพ์ใน cmd ว่า

gem install sqlite3-ruby

แล้วเลือก driver ที่เป็น win32 ตัวล่าสุด

จากน้ันไปแก้ใน config/database.yml ในชุดของ development และ test เป็น

development: # ใน test ด้วยครับ
adapter: sqlite3
dbfile: db/development.db

แล้วก็ทำการสร้าง table มาใช้งาน เราเข้าไปใน db/ แล้วพิมพ์ใน terminal ว่า

project_name/db$ sqlite3 development.db

แล้วก็ร่ำกันเลยด้วย sql command

แต่เดี๋ยวก่อนนนน เราทำ migration ได้แล้วนี่ ผมแนะนำให้ใช้ migration ครับ มาถึงก็สร้าง migration file ก่อนเลย แล้วก็ rake db:migrate ตามเรื่องครับ ดูตัวอย่างได้จากอันนี้ ไม่ต้องไปสร้าง db สร้าง table ให้วุ่นวาย

ปล. SQLite3 มี bug บน Windows นิดนึง คือถ้าตอนที่เรา load fixtures(เดี๋ยวจะมาเล่าให้ฟังอีกที) แล้วใน fixture file ของเราไม่ได้ระบุค่าอะไรให้มัน แทนที่มันจะเก็บค่าว่างๆ เอาไว้ มันจะเก็บเป็น NULL ซึ่งเป็น text แทน ส่วนวิธีซ่อม ให้ใช้เวอร์ชันที่ต่ำกว่า 3.3.7 (บน mac ไม่เห็นจะเป็นอะไร)

0 comments | Filed Under: Ruby on Rails | Tags: database

codegent: we're hiring