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 อีกครั้งหนึ่งเพื่อเสริมความเข้าใจ

Guided Project
- ติดตั้งโปรแกรม VS Code – text editor ฟรีของไมโครซอฟต์ (ใช้ได้ทั้ง Windows, Linux, Mac OS)
- นักเรียนที่ไม่ต้องการติดตั้ง VS Code สามารถใช้ notepad หรือ nano เพื่อทำโปรเจ็คนี้ได้เช่นกัน
- ดาวน์โหลด university.sql และ python template สำหรับโปรเจ็คนี้ที่นี่
ดูวิธีการเปลี่ยน theme VS Code และปรับ font size ในคลิปด้านล่าง
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 ทางขวาไว้แสดงผลลัพธ์โค้ดที่เรารัน
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
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
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
👩🏻💻 To do – ลองเขียน join
เพื่อดึงข้อมูลจากสองตารางพร้อมกัน
[su_spoiler title=”คลิกเพื่อดู Solution”]
select * from student join contact on student.id = contact.student_id;
[/su_spoiler]
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
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
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()
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
สรุปขั้นตอนที่สี่คือการเปิด connection กับฐานข้อมูล และสร้าง cursor เพื่อใช้ในการดึงข้อมูล เขียนโค้ดเสร็จแล้วให้เรา save ไฟล์ทุกครั้งนะครับ
Step 5 – เขียน Query เพื่อดึงข้อมูลที่ต้องการ
เขียน SQL query เพื่อดึงข้อมูลจากตารางที่ต้องการเก็บไว้ที่ตัวแปร sql
(จริงๆจะตั้งชื่อว่าอะไรก็ได้)
👩🏻💻 To do – เขียน query ที่ใช้ join
หรือ where
ในการดึงข้อมูล
## write simple query
sql = "select * from student limit 5;"
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
เสร็จแล้วใช้ 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()
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
👩🏻💻 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)
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
ทบทวนเรื่อง index ในภาษา Python จะเริ่มที่เลขศูนย์ (id, firstname, lastname, major, exam_score)
0
– id1
– firstname2
– lastname3
– major4
– 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
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
👩🏻💻 To do – แก้ไขโค้ด แสดงชื่อจริงและนามสกุลนักเรียนแต่ละคนเป็นตัวพิมพ์ใหญ่ทั้งหมดใน console
[su_spoiler title=”คลิกเพื่อดู 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
[/su_spoiler]
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 หลังเครื่องหมาย :
)
[su_spoiler title=”คลิกเพื่อดูวีดีโอ”]
[/su_spoiler]
Proper Way to Run Python
มาดูวิธีการเขียนโปรแกรมอย่างมืออาชีพกันบ้าง
Programmers เวลาเขียนโปรแกรม เรานิยมเขียน def
ฟังก์ชันขึ้นมา เสร็จแล้วค่อยเรียกใช้งานฟังก์ชันพวกนั้นใน script ของเรา วิธีนี้คือการจัดการโค้ดให้เป็นระบบ ตัวอย่าง script ด้านล่าง เราเขียนทั้งหมดสามฟังก์ชันดังนี้
verify_user()
ใช้ตรวจสอบ username กับ password ว่า user ใส่ถูกต้องหรือเปล่าget_data()
โปรแกรมที่เราต้องการรัน ในตัวอย่างนี้คือการดึงข้อมูลจาก university databasemain()
หรือ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() |
สังเกตบรรทัดที่ 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
[su_spoiler title=”ตัวอย่างการรับ 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)
[/su_spoiler]
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
ทบทวนบทเรียนทั้งหมดอีกครั้งหนึ่ง คลิกเมนูและเลือกบทเรียนที่ต้องการ