ใช้ Python ต่อฐานข้อมูล PostgreSQL

สมัยนี้เรามี framework หลายๆ ตัวที่ทำให้เราสามารถเขียนโปรแกรมเชื่อมต่อกับฐานข้อมูลได้โดยง่าย แต่ว่าก็อาจจะมีบางงานที่เราไม่อยากที่ต้องไปสร้างโปรเจคโดยใช้ framework นั้นๆ เราอยากจะแค่เขียนสคริปต่อกับฐานข้อมูลได้แบบเร็วๆ บทความนี้จะมาลองเขียน Python ต่อกับฐานข้อมูล PostgreSQL แบบง่ายๆ กัน

ผมทำสคริป Vagrant สร้างเครื่อง virtual machine (VM) ไว้ที่ hello-psycopg ซึ่งเครื่อง VM นี้จะถูกติดตั้ง Python 3 และ PostgreSQL รวมไปถึงโมดูล Psycopg ที่เป็นโมดูลของ Python เอาไว้เชื่อมต่อ PostgreSQL ไว้เรียบร้อยแล้ว ถ้าใครมี Vagrant อยู่แล้ว ก็โหลดไปแล้วสั่ง vagrant up ได้เลย ถ้าใครไม่มีก็ลองดูไฟล์ bootstrap.sh แล้วติดตั้งโปรแกรมตามนั้นครับ

สร้างฐานข้อมูลกับ PostgreSQL

  1. สั่ง sudo su postgres เพื่อให้ตัวเราเป็น user ชื่อ postgres ก่อน
  2. สร้าง user ของตัวเราเอง สั่ง createuser -P -s -e zkan โดย -P คือให้มันขึ้น prompt สำหรับกรอก password ส่วน -s คือให้เราเป็น super user และ -e คือให้แสดงผลคำสั่งที่เราสั่งไปยัง PostgreSQL ออกมาที่ terminal ของเรา (ในบทความนี้ผมใช้ password คือ 12345)
  3. สร้างฐานข้อมูลโดยให้เราเป็น owner สั่ง createdb mytestdb -O zkan ก็เป็นอันเสร็จ
  4. ถ้าเราอยากลองเข้าไปดูว่าในฐานข้อมูลนั้นมีอะไรบ้าง สั่ง psql -d mytestdb

ทำเสร็จแล้วน่าจะได้หน้าตาแบบรูปที่ 1

create-mytestdb

รูปที่ 1: สร้างฐานข้อมูล

สร้างตารางเอาไว้เก็บข้อมูล

  1. หลังจากที่เราสั่ง psql -d mytestdb แล้ว ให้เราใช้คำสั่ง SQL ได้เลย คือ create table traffic (sessions int); เราก็จะได้ตารางชื่อ traffic มา
  2. อยากลองดูข้อมูลในตารางบ้าง? สั่ง select * from traffic;

เสร็จแล้วจะได้แบบรูปที่ 2

create-traffic-table

รูปที่ 2: สร้างตาราง traffic

เขียน Python เพื่อ "ใส่ข้อมูล" ลงฐานข้อมูล

ใช้โค้ดตามนี้ (ผมขอตั้งชื่อไฟล์ว่า hello-psycopg.py)

import psycopg2


conn = psycopg2.connect("dbname='mytestdb' user='zkan' host='localhost' password='12345'")
cur = conn.cursor()
cur.execute("""insert into traffic (sessions) values (20)""")
conn.commit()

cur.close()
conn.close()

ไล่ตามโค้ดจะได้ว่า

  1. ใช้โมดูลขื่อ psycopg2
  2. เรา connect ไปยังฐานข้อมูลโดยใช้ username กับ password
  3. เราเก็บตัว cursor ซึ่งจะเป็นตัวที่เราใช้รันคำสั่ง SQL ของ PostgreSQL สั่งด้วยเมธอด execute
  4. บรรทัด conn.commit() เป็นบรรทัดที่สำคัญมาก ถ้าเราต้องการที่จะเพิ่มข้อมูล อัพเดทข้อมูล หรือลบข้อมูล (สร้างการเปลี่ยนแปลงกับข้อมูลของเรา) เราจำเป็นต้องมีบรรทัดนี้
  5. พอใช้งานเสร็จเราก็ปิด connection กับ cursor ก็เป็นอันเสร็จ

เขียน Python เพื่อ "ดึงข้อมูล" จากฐานข้อมูล

ใช้โค้ดตามนี้

import psycopg2


conn = psycopg2.connect("dbname='mytestdb' user='zkan' host='localhost' password='12345'")
cur = conn.cursor()
cur.execute("""SELECT * FROM traffic""")
rows = cur.fetchall()
for each in rows:
    print(each)

cur.close()
conn.close()

จากโค้ดด้านบนจะเห็นได้ว่าเราไม่ต้องใช้ conn.commit() เพราะเราแค่ดึงข้อมูลออกมา ไม่ได้สร้างการเปลี่ยนแปลงอะไร แล้วเราก็ใช้ cur.fetchall() เพื่อดึงข้อมูลออกมา

ถ้ากำลังมองหาอยู่ ลองเอาไปใช้กันดูนะครับ 🙂


Kan Ouivirach

Kan Ouivirach

Lead Software Architect

Being interested in Agile software development, I joined an Agile team at Pronto Tools as a Research & Development Architect (as Lead Software Architect now). I am an enthusiastic architect who not only has a scientific mindset, but also a practical approach to software solutions.