ITF Final Project

Project Overview

สำหรับ final project เราจะเขียน python script เพื่อเชื่อมต่อกับ university.db และรับข้อมูลจาก user เพื่อแสดงลัพธ์ใน command prompt ใช้เวลาทั้งหมดประมาณหนึ่งชั่วโมง

นักเรียนสามารถใช้ text editor ที่ต้องการ (notepad หรือ VS code) เพื่อเขียน python script สำหรับโปรเจ็คนี้ เราแนะนำให้นักเรียนติดตั้งโปรแกรม VS code เพราะใช้งานฟรี ฟีเจอร์ครบ มี syntax highlight กับ auto-completion สำหรับภาษา Python ช่วยให้เราเขียนโค้ดได้ง่ายขึ้น +200%

โปรเจ็คนี้จะแบ่งออกเป็น 7 steps + 1 optional step นักเรียนสามารถทำตามได้เลยในหัวข้อ Guided Project ด้านล่าง เสร็จแล้วดูวีดีโอเฉลย walk-through อีกครั้งหนึ่งเพื่อเสริมความเข้าใจ

ตัวอย่างโปรเจ็ค python script ใน vs code

Guided Project

  • ติดตั้งโปรแกรม VS Code – text editor ฟรีของไมโครซอฟต์ (ใช้ได้ทั้ง Windows, Linux, Mac OS)
  • นักเรียนที่ไม่ต้องการติดตั้ง VS Code สามารถใช้ notepad หรือ nano เพื่อทำโปรเจ็คนี้ได้เช่นกัน
  • ดาวน์โหลด university.sql และ python template สำหรับโปรเจ็คนี้ที่นี่
คลิกเพื่อดูวิธีการเปลี่ยน theme VS Code และปรับ font size
คลิก gear icon เพื่อดูแบบ HD หรือดูแบบ full screen คอมแอดใช้ Dark Theme ขนาดฟ้อนท์ 18-20

Step 1 – เตรียมไฟล์ .sql เพื่อสร้างตารางใน database

สร้างโฟลเดอร์ใหม่ชื่อว่า final-project บนหน้า Desktop และ navigate ไปที่โฟลเดอร์นี้

mkdir final-project
cd .\final-project

มาเริ่มจากการสร้างฐานข้อมูลของเรากันก่อน สมมติวันนี้เราเป็นอาจารย์ในมหาวิทยาลัยที่ต้องการสร้างฐานข้อมูลเพื่อเก็บข้อมูลนักศึกษาของเรา นำไฟล์ university.sql และ template.py ที่ดาวน์โหลดมาใส่ในโฟลเดอร์นี้

👩🏻‍💻 To do – ลองสร้างไฟล์ .db ของตัวเอง โดยมีอย่างน้อยสองตาราง แต่ละตารางมีอย่างน้อย 10 records เว็บไซต์นี้สามารถสร้างชื่อจริง นามสกุลภาษาอังกฤษแบบ random ให้เราได้ด้วย

ที่ผ่านมาเราใช้โปรแกรม notepad ในการเปิดไฟล์ text ต่างๆ โปรเจ็คนี้เราจะเปลี่ยนมาใช้ VS Code กันบ้าง ให้เราพิมพ์คอมมานด์ code ตามด้วยชื่อ text file ที่ต้องการ

code university.sql

ใน Windows เราสามารถเรียงหน้าต่างโปรแกรมแบบ split จอได้ เวลาเราเขียนโค้ดเราจะแบ่งหน้าจอเป็นโปรแกรม Text Editor ทางซ้ายและ Command Prompt หรือ Terminal ทางขวาไว้แสดงผลลัพธ์โค้ดที่เรารัน

คลิกเพื่อดูวีดีโอ

Note – สำหรับนักเรียนที่ใช้ mac ก่อนจะใช้คอมมานด์ code ได้ ต้อง install code ที่ PATH ก่อนนะครับ หลังจากติดตั้งโปรแกรม VS Code เสร็จแล้ว ให้เปิดโปรแกรมขึ้นมา และกด Ctrl+Shift+P พิมพ์ shell command เพื่อติดตั้ง code command ที่ PATH สามารถทำตามบทความนี้ได้เลย

Step 2 – เข้าสู่โหมด sqlite3 และอ่านไฟล์ .sql

สำหรับตัวอย่างต่อๆไป แอดจะสอนด้วยไฟล์ university.sql ที่เตรียมไว้นะครับ นักเรียนสามารถใช้ .sql ที่เขียนเองเลยก็ได้จากขั้นตอนที่หนึ่ง

👩🏻‍💻 To do – สร้างไฟล์ university.db เข้าสู่โหมด sqlite3 และใช้คอมมานด์ .read เพื่ออ่านไฟล์ university.sql เพื่อสร้างสองตารางชื่อว่า student และ contact ตามลำดับ

sqlite3 university.db
.read university.sql

รันคอมมานด์ .tables เพื่อเรียกดูชื่อตารางทั้งหมดใน database และเขียน select statement เพื่อพรีวิวข้อมูลของตารางที่ต้องการ

.tables

.mode column
.headers on

select * from student limit 5;
select * from contact limit 5;

เสร็จแล้วพิมพ์ .quit เพื่อกลับสู่ command prompt

คลิกเพื่อดูวีดีโอ

👩🏻‍💻 To do – ลองเขียน join เพื่อดึงข้อมูลจากสองตารางพร้อมกัน

คลิกเพื่อดู Solution
select * from student join contact on student.id = contact.student_id;

Step 3 – เริ่มเขียน Python ใน VS Code

copy ไฟล์ template.py และเปลี่ยนชื่อเป็น final_project.py เปิดไฟล์นี้ด้วย VS Code

copy template.py final_project.py
code final_project.py

👩🏻‍💻 To do – แก้ไขชื่อเจ้าของโปรเจ็คนี้ในบรรทัดที่สอง (เปลี่ยนเป็นชื่อนักเรียน) ใน template แอดเขียน #comment สิ่งที่นักเรียนต้องทำไว้หมดแล้ว

Python 3.8 ถูกติดตั้งมาพร้อมกับ standard package เช่น os, math และ sqlite3 สำหรับจัดการไฟล์ฐานข้อมูล เราสามารถ import ชื่อ package/ module ที่ต้องการได้ด้วยโค้ดด้านล่าง (เขียนใน VS Code)

import sqlite3

จบขั้นตอนที่สาม ใน step ต่อๆไปเราจะเขียน Python เพื่อเชื่อมต่อฐานข้อมูล เขียน Query ที่เราต้องการและแสดงผลลัพธ์ใน console

คลิกเพื่อดูวีดีโอ

Step 4 – เชื่อมต่อกับฐานข้อมูล

👩🏻‍💻 To do – อ่านวิธีการเขียน sqlite3 ใน Python ได้ที่นี่

หลังจากเรา import sqlite3 แล้ว เราจะใช้ฟังก์ชัน connect() เพื่อเชื่อมต่อกับไฟล์ .db ที่อยู่ใน working directory สร้างเป็น object ชื่อว่า conn (ย่อมาจาก connection)

## connect to database
conn = sqlite3.connect("university.db")

เสร็จแล้วเราจะสร้าง object cur (ย่อมาจาก cursor) เปรียบเสมือน pointer ที่จะวิ่งไปตาม records ต่างๆในตารางเพื่อดึงข้อมูลตาม query ที่เราเขียน เราใช้ .cursor() method กับตัว conn object

## create cursor to execute our queries
cur = conn.cursor()
คลิกเพื่อดูวีดีโอ

สรุปขั้นตอนที่สี่คือการเปิด connection กับฐานข้อมูล และสร้าง cursor เพื่อใช้ในการดึงข้อมูล เขียนโค้ดเสร็จแล้วให้เรา save ไฟล์ทุกครั้งนะครับ

Step 5 – เขียน Query เพื่อดึงข้อมูลที่ต้องการ

เขียน SQL query เพื่อดึงข้อมูลจากตารางที่ต้องการเก็บไว้ที่ตัวแปร sql (จริงๆจะตั้งชื่อว่าอะไรก็ได้)

👩🏻‍💻 To do – เขียน query ที่ใช้ join หรือ where ในการดึงข้อมูล

## write simple query
sql = "select * from student limit 5;"
คลิกเพื่อดูวีดีโอ

เสร็จแล้วใช้ method .execute() และ .fetchall() ของ cursor object เพื่อดึงข้อมูลทั้งหมดมาใส่ในตัวแปร result ทบทวนอีกครั้ง cursor คือ pointer ที่เราใช้ในการดึงข้อมูลจาก database โดยหลักการ cursor จะดึงข้อมูลออกมาทีละ row/ record

  • .execute() คือการดึงข้อมูลมาเก็บไว้ที่ cursor object
  • .fetchall() คือการดึงข้อมูลมาเก็บที่ตัวแปร result เพื่อใช้ทำงานอื่นๆต่อไป
## execute query and fetch result
cur.execute(sql)
result = cur.fetchall()
คลิกเพื่อดูวีดีโอ

👩🏻‍💻 To do – ลอง print result ใน console ข้อมูลที่เราดึงออกมาเป็น data structure แบบใด List, Tuple หรือ Dictionary?

หลังจากเรียนใช้งาน database เสร็จแล้ว ให้เราปิด connection เสมอ ใน Python คือการ free memory เพราะว่าไฟล์ .db จะถูกเก็บอยู่ใน memory หรือ RAM จนกว่าเราจะรัน .close() method

## close connection
conn.close()

Step 6 – แสดงผลข้อมูลใน console

ข้อมูลที่เราดึงออกมาจาก result จะถูกเก็บอยู่ในรูปแบบ List of Tuple ถ้าเราปริ้นท์ result ไปใน console จะได้ผลลัพธ์หน้าตาแบบนี้ ข้อมูลแต่ละ record คือ (tuple) ที่ถูกเก็บอยู่ใน [list]

[ (1, "David" , "Finch"   , "Marketing", 88), 
  (2, "Mark"  , "Spencer" , "Marketing", 58),
  (3, "John"  , "Thompson", "Marketing", 90),
  (4, "Keira" , "Bush"    , "Marketing", 45),
  (5, "Tommy" , "Woods"   , "Marketing", 67) ]

เราสามารถเขียน for loop เพื่อแสดงผลลัพธ์ทีละ record ใน console

for row in result:
  print(row)
คลิกเพื่อดูวีดีโอ

ทบทวนเรื่อง index ในภาษา Python จะเริ่มที่เลขศูนย์ (id, firstname, lastname, major, exam_score)

  • 0 – id
  • 1 – firstname
  • 2 – lastname
  • 3 – major
  • 4 – exam_score

👩🏻‍💻 To do – แก้ไขโค้ดในตัวอย่างด้านบน ลองปริ้นชื่อ firstname + ” ” + lastname ของนักเรียนแต่ละคนใน console

Step 7 – ปรับแต่งข้อมูลด้วย fstring

เพื่อให้การแสดงผลสวยงามและมีความหมาย เราสามารถ format row ด้วย fstring ตามตัวอย่างด้านล่าง \t ย่อมาจาก tab เปรียบเสมือนการกด tab ในคีย์บอร์ดเพื่อเพิ่มช่องว่างให้กับ print statement ลองรัน script เพื่อดูตัวอย่างผลลัพธ์

for row in result:
  print(f"name: {row[1]} \t score: {row[4]}")

เราใช้ index 1 เพื่อดึงชื่อจริงนักเรียน และ index 4 เพื่อดึงคะแนนสอบ ด้านล่างคือผลลัพธ์ที่แสดงใน console

name: David     score: 88
name: Mark      score: 58
name: John      score: 90
name: Keira     score: 45
name: Tommy     score: 67
คลิกเพื่อดูวีดีโอ

👩🏻‍💻 To do – แก้ไขโค้ด แสดงชื่อจริงและนามสกุลนักเรียนแต่ละคนเป็นตัวพิมพ์ใหญ่ทั้งหมดใน console

คลิกเพื่อดู Solution
## use .upper() method
for row in result:
  fullname = row[1] + " " + row[2]
  print(f"fullname: {fullname.upper()}")

## result
fullname: DAVID FINCH
fullname: MARK SPENCER
fullname: JOHN THOMPSON
fullname: KEIRA BUSH
fullname: TOMMY WOODS

Optional – ตั้งค่า username และ password

เราสามารถกำหนด username กับ password ให้กับ authorized users เท่านั้นด้วยการเขียน if-else block เพื่อเช็คสิทธิ์ในการเข้าถึงข้อมูล

เราใช้ฟังก์ชัน input() เพื่อรับข้อมูลจาก user ถ้า username == “admin” และ password == “2020” โปรแกรมของเราจะทำงานปกติ แต่ถ้า username หรือ password ผิด ให้ปริ้นท์ข้อความ “Your username or password is incorrect” ใน console

print("University Grade Result")
print("Please type in your username and password to access result")
username = input("Username: ")
password = input("Password: ")

if username == "admin" and password == "2020":
  [YOUR PROGRAM]
else:
  print("Your username or password is incorrect")

[YOUR PROGRAM] ในโปรแกรมด้านบนคือ code ทั้งหมดที่เราเขียนตั้งแต่ step 1-7 แค่ copy ไปใส่ใน if block และย่อหน้าอย่างน้อย 2 spaces (VS Code จะย่อหน้าให้เราอัตโนมัติ เวลาเราเคาะ enter หลังเครื่องหมาย :)

คลิกเพื่อดูวีดีโอ

Proper Way to Run Python

มาดูวิธีการเขียนโปรแกรมอย่างมืออาชีพกันบ้าง

Programmers เวลาเขียนโปรแกรม เรานิยมเขียน def ฟังก์ชันขึ้นมา เสร็จแล้วค่อยเรียกใช้งานฟังก์ชันพวกนั้นใน script ของเรา วิธีนี้คือการจัดการโค้ดให้เป็นระบบ ตัวอย่าง script ด้านล่าง เราเขียนทั้งหมดสามฟังก์ชันดังนี้

  • verify_user() ใช้ตรวจสอบ username กับ password ว่า user ใส่ถูกต้องหรือเปล่า
  • get_data() โปรแกรมที่เราต้องการรัน ในตัวอย่างนี้คือการดึงข้อมูลจาก university database
  • main() หรือ main program เป็นวิธีมาตรฐานสำหรับรันโปรแกรมใน Python

ขั้นตอนการทำงานของโปรแกรมนี้คือ

User ใส่ username/ password และโปรแกรมจะเช็คว่าถูกต้องหรือเปล่าด้วยฟังก์ชัน verify_user() ถ้าถูกต้อง True โปรแกรมจะรันฟังก์ชัน get_data() ถ้าผิด False โปรแกรมจะปริ้นท์ว่า "Your username or password is incorrect"

ลองศึกษาโค้ดด้านล่าง มีบรรทัดไหนที่อ่านไม่เข้าใจหรือเปล่า? (ไม่มี :P) เก่งมากทุกคน!

import sqlite3
def verify_user():
"""
verify if user input correct username/password
if True then run get_data function else program ends
"""
print("Student Exam Score Result")
print("Please type in your username and password to access result")
username = input("Username: ")
password = input("Password: ")
if username == "admin" and password == "2020":
get_data()
else:
print("Your username or password is incorrect")
def get_data():
"""
connect to database and get data
format and present result in console
"""
conn = sqlite3.connect("university.db")
cur = conn.cursor()
cur.execute("SELECT id, firstname, exam_score FROM student;")
result = cur.fetchall()
conn.close()
print("Student Exam Score Report")
print("=" * 30)
for row in result:
print(f"name: {row[1]} \texam score: {row[2]}")
def main():
"""our main program"""
verify_user()
if __name__ == "__main__":
main()
view raw itf_final_project.py hosted with ❤ by GitHub

สังเกตบรรทัดที่ 36-37 คือการเขียน if เพื่อรันโปรแกรม อันนี้คือวิธีมาตรฐานสำหรับรัน Python Program

เวลาเราเขียน .py Python จะสร้างตัวแปรชื่อว่า __name__ อัตโนมัติไว้สำหรับรันโปรแกรม เราเขียน if เพื่อเช็คว่าชื่อ __name__ เท่ากับ __main__ หรือเปล่า (ค่าตั้งต้นของโปรแกรม) ถ้าใช่ ให้รันฟังก์ชัน main() ได้เลย

if __name__ == "__main__":
  main()

จริงๆเราสามารถเขียน main() เฉยๆเพื่อรันโปรแกรมเลยก็ได้ แต่ Pythonic Way เราเขียนกันแบบนี้ อ่านเพิ่มเติมเรื่อง __main__ ได้ที่บทความนี้

Note – ในเชิงเทคนิค ตัวแปร __name__ ขึ้นอยู่กับวิธีการรันโปรแกรมของเรา สำหรับคอร์สนี้แอดอยากให้ทุกคนเห็นวิธีการรันโปรแกรมง่ายๆก่อน วิธีที่ง่ายที่สุดคือที่เราเพิ่งอธิบายไป


Further Development

นักเรียนสามารถพัฒนาโปรแกรมที่เราเขียนในโปรเจ็คนี้ต่อได้ ตัวอย่างไอเดีย เช่น

  • ปรับ function ของเราให้รับ input จาก user ได้ด้วย เช่น ชื่อ table ที่ต้องการดึงข้อมูล หรือจำนวนแถวที่ต้องการแสดงใน console
  • เขียน join เพื่อดึงข้อมูลจากหลายๆตาราง
  • ปรับ format การแสดงผลข้อมูลให้ซับซ้อนขึ้น
  • ใช้ if-else block เพื่อเพิ่มลูกเล่นให้กับโปรแกรม เช่น ถ้า input == “1” ให้รันฟังก์ชันนี้ หรือ input == “2” ให้รันอีกฟังก์ชันหนึ่ง
  • เราสามารถอัพเดทข้อมูลใน database ด้วย .commit() อ่านวิธีการใช้งานได้ที่ python document sqlite3
ตัวอย่างการรับ input ชื่อตารางจาก user
## get input from user
table_name = input("table name: ")
n_rows = input("how many rows do you want: ")

## create sql statement
sql = f"SELECT * FROM {table_name} LIMIT {n_rows};"
print(sql)

Wrap Up

🏆 ยินดีกับนักเรียนทุกคนอีกครั้งหนึ่ง ตอนนี้เราสามารถเขียนโปรแกรมพื้นฐานใน Python เป็นแล้วครับ skills ที่เราเรียนในคอร์สนี้คือพื้นฐานสำคัญที่จะช่วยให้ทุกคนต่อยอดในสายงานด้าน IT, Data Analytics หรือ Data Science ได้อย่างแน่นอน

Core Skills

สรุปทักษะที่นักเรียนได้จากโปรเจ็คนี้

  • Command Line จัดการไฟล์และโฟลเดอร์เบื้องต้น
  • VS Code เขียนโค้ดด้วย professional text editor และรันโปรแกรมใน CMD
  • SQL สร้าง database และ table เพื่อเก็บข้อมูล
  • SQL เขียน query เพื่อดึงและวิเคราะห์ข้อมูลจาก database
  • Python สร้างและพัฒนาโปรแกรม เชื่อมต่อกับ database และ format ผลลัพธ์
  • เข้าใจวิธีการเชื่อมต่อ conn, cursor ดึงข้อมูล และปิด connection

Feedback

นักเรียนที่เรียน Module นี้จบแล้ว ช่วยตอบแบบสอบถามความพอใจด้วยการกดลิ้ง feedback ด้านล่างด้วยนะครับ แอดจะนำข้อมูลทั้งหมดมาปรับปรุงเนื้อหาอื่นๆต่อไป ถ้าใครอยากเรียนเรื่องอะไรเพิ่ม สามารถคอมเม้นท์บอกแอดได้เลยนะครับ ขอบคุณทุกคนมากๆครับ Keep in touch!


Congratulations

ทบทวนบทเรียนทั้งหมดอีกครั้งหนึ่ง คลิกเมนูและเลือกบทเรียนที่ต้องการ


Bonus Content

แอดกำลังทำบทเรียนพิเศษเรื่อง CSV และ Machine Learning ติดตามได้เร็วๆนี้ครับ