ในบทความนี้เราจะมาเรียนรู้และสอนการใช้งาน Python (Flask) ร่วมกันกับ flask-SQLAlchemy ซึ่งเป็นตัว ORM ไลบรารี่ ของ Flask ในการเชื่อมต่อฐานข้อมูลโดยไม่ต้องเขียนโค้ดภาษา SQL แม้แต่สักบรรทัดเดียว ช่วยสร้าง Productivity และทำให้สามารถพัฒนาโปรเจคท์ได้อย่างรวดเร็ว นอกจากใช้ ORM แล้ว ยังจะพาไปรู้จัก SQLite ซึ่งเป็น Database ที่เบาหวิว พัฒนาโปรเจคท์ได้รวดเร็ว และ DB Browser ซึ่งเป็นโปรแกรมที่ใช้สำหรับเปิดใช้งาน จัดการฐานข้อมูลของ SQLite และตบท้ายด้วย PostgreSQL เผื่อท่านใดที่ต้องการใช้ร่วมกับฐานข้อมูลระดับโปรดักชั่น
จุดประสงค์
- สามารถใช้งาน Flask และสร้างโปรเจคท์ผ่าน PyCharm ได้
- เข้าใจและสามารถประยุกต์ใช้งาน SQLAlchemy ได้
- รู้และเข้าใจ ORM (Object Relational Mapping) รวมถึงสามารถอธิบายข้อดีและข้อเสียได้
- รู้และเข้าใจ SQLite รวมถึงสามารถอธิบายข้อดีและข้อเสียได้
- เข้าใจการสร้างตารางเพื่อเก็บข้อมูลใน Database ผ่าน Class/Object ของภาษาไพธอน
- รู้และเข้าใจ Python Shell ได้ เพื่อทำการสร้าง เข้าถึง เพิ่มข้อมูล ลบข้อมูล หรือไม่ว่าจะเป็นการดึงข้อมูลในฐานข้อมูลได้
- รู้และเข้าใจ DB Browser และสามารถเปิดไฟล์ตารางต่าง ๆ ของ SQLite ผ่าน DB Browser ได้
- เปลี่ยนฐานข้อมูลจาก SQLite ไปเป็น PostgreSQL ได้
Software & Tools
- Python(Version 3+)
- Flask (Python Web Framework)
- PyCharm (IDE)
- SQLite3 (Database)
- DB Browser (SQLite GUI Tools)
ลิ้งค์ YouTube แนะนำ
- ติดตั้ง PyCharm เพื่อเขียนไพธอน
- ติดตั้งและใช้งาน DB Browser (Windows)
- ติดตั้งและใช้งาน DB Browser (mac)
เริ่มต้นสร้าง Flask Project
เริ่มต้นสร้างโปรเจคท์ผ่าน PyCharm โดยเปิดขึ้นมาแล้วทำการคลิ๊ก File > New Project…

เริ่มต้นสร้างโปรเจคท์
จากนั้นทำการตั้งชื่อโปรเจคท์ โดยในบทความนี้ใช้ชื่อว่า flask-orm-alchemy

ตั้งชื่อโปรเจคท์ตามต้องการ ในที่นี้ใช้ flask-orm-alchemy
รอ PyCharm ทำการ Generate โปรเจคท์และสร้าง Virtual Environment สักครู่ จะเห็นว่าตัว PyCharm IDE นั้นค่อนข้างที่จะสะดวก ไม่ต้องสร้าง Virtual Environment เอง เพราะ PyCharm สร้างให้อัตโนมัติ โดยมีชื่อว่า (venv)

สร้างไพธอนไฟล์ขึ้นมาใหม่ โดยมีชื่อไฟล์ว่า app.py
ติดตั้ง Flask
ทำการติดตั้ง flask เสียก่อนในลำดับแรก
pip install flask
ลิ้งค์ YouTube และบทความแนะนำ
- Python flask Ep.1 - เรียนรู้และเริ่มต้นสร้างโปรเจคท์ด้วย Flask (บทความ)
- Flask Introduction - แนะนำ Flask (YouTube)
- Python Web Development with Flask (Course)
จากนั้นทำการเขียนโค้ดตามด้านล่างเพื่อทดสอบรันแสดงผล Hello, world
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello, world"
if __name__ =="__main__":
app.run(debug=True)
จากนั้นทำการรัน python app.py

รันแอพ
จะได้

แสดงผล “Hello, world” ที่พอร์ต 127.0.0.1:5000 (Localhost)
SQLAlchemy
สร้างตารางในรูปแบบของ Object Relational Mapping (ORM) โดยที่ไม่ต้องเขียน SQL ตามที่ได้กล่าวไว้ด้านบน ซึ่งข้อดีและข้อเสียหลัก ๆ เอาไว้ประกอบการพิจารณาเลยก็คือ
ข้อดีข้อเสียของ ORM (Object Relational Mapping)
ข้อดี
- พัฒนาโปรเจคท์ได้อย่างรวดเร็ว เพราะไม่จำเป็นต้องรู้ Syntax ของภาษา SQL
- Based on ภาษานั้น ๆ เช่น Flask-SQLAlchemy ก็เป็น ORM ไลบรารี่ของ Flask (Python) ทำให้ง่ายต่อการพัฒนาโปรแกรม รู้ภาษาเดียวก็จัดการกับฐานข้อมูลได้แล้ว
- Codebase ยังเหมือนเดิมเกือบทั้งหมด เช่น ถ้าเปลี่ยนตัว Database จาก SQLite ไปเป็น PostgreSQL หรือ MySQL , etc เพราะ Based on Python นั่นคือใช้ Python Class/Object ในการ Interact (ปฏิสัมพันธ์/สื่อสาร) และ Access (เข้าถึง) ฐานข้อมูล
ข้อเสีย
- การรู้ SQL มาก่อนจะเป็นประโยชน์มากกว่า เพราะรู้ว่าคำสั่งที่ใช้จริง ๆ แล้วเบื้องลึก(Under the hood)ของคำสั่งนั้น ทำหน้าที่อะไร อาจพลาดฟีเจอร์ที่จำเป็นบางอย่างหรือใช้ฟังก์ชันของบางคำสั่งได้ไม่เต็มประสิทธิภาพของ Raw SQL ซึ่งจะเป็นประโยชน์ในระยะยาวในการออกแบบฐานข้อมูลให้กับโปรแกรมมากกว่า
- แอปพลิเคชั่นที่พัฒนาจะช้ากว่าการเขียนด้วย Raw SQL เพราะต้องทำการแปลง Objects และแม็ปไปเป็น SQL Statements
ทำการติดตั้ง flask-sqlalchemy ซึ่งเป็นไลบรารี่ที่เอาไว้ใช้สำหรับเชื่อมต่อ Flask กับ SQLAlchemy
pip install flask_sqlalchemy
SQLite
SQLite เป็นฐานข้อมูลที่เก็บข้อมูลในรูปแบบของ text file ในรูปแบบของไฟล์ ๆ เดียว (Single File) แต่สามารถสร้างตารางหลาย ๆ ตารางได้ และไม่ต้องทำการติดตั้งให้ยุ่งยากเพราะเป็น Builtin Library ที่มีมาให้กับไพธอนเรียบร้อย ขอยกเอาข้อดี ข้อเสียของ SQLite มาให้อ่านคร่าว ๆ กันครับ
ข้อดีข้อเสียของ SQLite
ข้อดี
- เบาหวิว มีขนาดเล็ก เก็บข้อมูลในรูปแบบ single file text (ไฟล์ ๆ เดียว)
- ไม่ต้องคอนฟิกให้ยุ่งยากเพราะไม่ต้องใช้เซิร์ฟเวอร์ (Serverless) จึงไม่ต้องคอนฟิกค่าต่าง ๆ เช่น port, username, password, etc เพื่อเชื่อมต่อกับ Server โดยทำงานร่วมกันกับ Application โดยตรง
- สามารถพัฒนาโปรเจคท์ได้ง่าย สะดวก รวดเร็ว
- ฯลฯ
ข้อเสีย
- ไม่เหมาะสำหรับโปรเจคท์ขนาดใหญ่ที่มีการ request เข้ามาพร้อมกันเยอะ ๆ
- ความปลอดภัยน้อยกว่า Database ใหญ่ ๆ ตัวอื่น ๆ เช่น PostgreSQL, MySQL, etc (ก็แน่นอนล่ะ)
- มีฟีเจอร์บางฟีเจอร์ที่ขาดในการ Query ที่ซับซ้อน (Complex Query)
Database URI
กำหนด Database URI สำหรับ SQLite3 เพื่อให้ Flask ทำการเชื่อมต่อกับ SQLite ได้ถูกต้องใน path ที่กำหนด
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
ทำการสร้างตัวแปรหรือ object/ class instance ของ SQLAlchemy ขึ้นมา โดยมีชื่อว่า db เพื่อเข้าถึงคลาสและเมธอดต่าง ๆ ใน SQLAlchemy
db = SQLAlchemy(app)
ทำการสร้างตารางเพื่อเก็บข้อมูล โดยจะอยู่ในรูปแบบของ class โดยตารางมีชื่อว่า User
โดยเก็บข้อมูลในตารางนี้ 3 ฟีลด์ (คอลัมน์) คือ id, username และ email
class User(db.Model):
"""Create columns to store our data"""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(60), unique=True, nullable=False)
email = db.Column(db.String(60), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
โดย
db.string : กำหนดว่าจะเก็บข้อมูลในรูปแบบไหน ในที่นี้เก็บเป็น string, ข้อความ ตัวอักษร
primary_key : กำหนดให้ฟีลด์นี้ (id) เป็นคีย์หลัก โดยข้อมูลในฟีลด์นี้จะเก็บเป็นแบบตัวเลข (integer) และต้องไม่ซ้ำ (Unique)
unique : คือค่านี้สามารถที่จะซ้ำกันได้หรือไม่ในฐานข้อมูล กำหนดให้เป็นจริงคือซ้ำไม่ได้
nullable : ยอมให้ค่าว่างได้หรือไม่ในคอลัมน์นี้ กำหนดให้ไม่สามารถว่างได้คือ False
จาก class ด้านบนที่ได้สร้างไว้จะเห็นว่าไม่มีการเขียน SQL ตัว ORM (SQLAlchemy) จะทำการแปลง Python Objects ไปเป็น SQL Statement ดังโค้ดด้านล่าง
CREATE TABLE user (
id INTEGER NOT NULL,
username VARCHAR(60) NOT NULL,
email VARCHAR(60) NOT NULL,
PRIMARY KEY (id),
UNIQUE (username),
UNIQUE (email)
)

ความสัมพันธ์ระหว่าง Python, ORM และ Database
Python (Flask Framework) –> ORM (SQLAlchemy) –> Database (SQLite3)
สร้างฐานข้อมูล SQLite ผ่าน Terminal
ไปที่ Terminal**** ของ PyCharm
ทำการอิมพอร์ต db ซึ่งเป็น object/instance ของ SQLAlchemy ที่ได้กำหนดไว้ในโค้ดด้านบน
PyCharm Terminal
from app import db
จากนั้นทำการสร้างตารางโดยใช้คำสั่ง
db.create_all()

สังเกตที่ side bar ของ PyCharm จะเห็นว่าตอนนี้มีไฟล์ test.db ปรากฏขึ้นมา เป็นการเสร็จสิ้นขั้นตอนสร้าง Database ของ SQLite สำหรับ Flask

ไฟล์ test.db ถูกสร้างขึ้นมา
DB Browser
ตอนนี้สามารถสร้าง Database ที่จัดเก็บข้อมูลในรูปแบบของไฟล์เดี่ยว ๆ ได้เสร็จสิ้นเรียบร้อย ขั้นตอนต่อมาจะเป็นการเรียกดูตารางหรือข้อมูลต่าง ๆ ใน Database ของเรา โดย SQLite นั้นไม่จำเป็นต้องมี Server แยก เพื่อทำการเชื่อมต่อกับ Flask แอพของเรา ดังนั้นจะเห็นได้ว่าไม่จำเป็นต้องมีการคอนฟิก พอร์ต, usernaem, password, etc ให้ยุ่งยาก โดยมีโปรแกรมเพียงแค่หนึ่งโปรแกรมที่ต้องทำการดาวน์โหลดเพิ่มเข้ามาคือ DB Browser ซึ่งจะเอาไว้ใช้สำหรับเปิดหรือเรียกดู จัดการข้อมูลในฐานข้อมูลของเรานั่นเอง
ถ้านึกภาพไม่ออก ให้ลองดูการจับคู่ด้านล่าง
MySQL > phpMyAdmin
PostgreSQL > pgAdmin
SQLite > DB Browser
ถ้าท่านใดที่เคยใช้งาน phpMyAdmin , pgAdmin มา ก็จะเข้าใจได้ว่า DB Browser ก็จะถูกจัดอยู่ในประเภทเหล่านี้
****
ใช้งาน DB Browser
หลังจากที่ติดตั้ง DB Browser เสร็จเรียบร้อยแล้ว ให้ทำการเปิดขึ้นมาใช้งาน

หน้าตาของโปรแกรม DB Browser
เปิดไฟล์ Database ตาม path ที่อยู่ของโปรเจคท์ ซึ่งจะอยู่ในโฟลเดอร์ PycharmProjects ทำการ เปิด

เปิดไฟล์ test.db เพื่ออิมพอร์ตเข้ามาใช้งาน
ในฐานข้อมูลจะปรากฏตารางที่ได้ทำการสร้างไว้เสร็จสิ้นเรียบร้อย 1 ตารางก็คือตาราง user

จะพบกับตาราง user
ตาราง user ยังเป็นตารางเปล่า ๆ ยังไม่ได้เพิ่มข้อมูลใด ๆ เข้ามา
****
Flask with PostgreSQL (เพิ่มเติม)
สำหรับท่านใดที่ต้องการใช้ PostgreSQL ให้ทำการคอนฟิกและเปลี่ยน path ของ URI ดังต่อไปนี้
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:1234@localhost/mydatabase'
โดยค่าต่อไปนี้สามารถทำการเปลี่ยนตามข้อมูลของแต่ละคน
postgres : คือ Username
1234 : คือ Password
mydatabase : คือ ชื่อ Database ที่ได้สร้างไว้ใน pgAdmin
และอย่าลืมติดตั้ง psycopg2 ซึ่งเป็น Database Connector Library เพื่อให้ flask สามารถสื่อสารกับ PostgreSQL ได้
pip install psycopg2
ลิ้งค์ YouTube และบทความแนะนำ
- How to start a Django project with a database PostgreSQL (บทความ)
- ดาวน์โหลดและติดตั้ง PostgreSQL และ pgAdmin (YouTube)
- Python with Development with Django (Course ใช้ PostgreSQL)
Final Code
app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
class User(db.Model):
"""Create a class (Table) & Field (Columns) to store our data"""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(60), unique=True, nullable=False)
email = db.Column(db.String(60), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
@app.route('/')
def home():
return "Hello, world"
if __name__ == "__main__":
app.run(debug=True)
สำหรับบทความ ใช้งาน Flask ร่วมกับ SQLAlchemy เพื่อเชื่อมต่อฐานข้อมูลโดยใช้ ORM ก็จะขอจบลงเพียงเท่านี้ครับ ผมหวังเป็นอย่างยิ่งว่าเพื่อน ๆ คงจะได้เรียนรู้ตามจุดประสงค์ที่ผมได้เขียนไว้ได้อย่างครบถ้วน ขาดตก บกพร่องตรงไหน หรืออยากให้เขียนบทความเกี่ยวกับอะไร ก็แนะนำกันเข้ามาได้ที่คอมเมนต์ด้านล่างกันได้เลยนะครับ หรือมีคำติชมก็แนะนำเข้ามาได้เช่นกัน พร้อมน้อมรับครับผม
พบกันกับบทความถัดไป
Follow us on
Medium: STACKPYTHON
Youtube: STACKPYTHON
Facebook: STACKPYTHON
อ้างอิง
Flask SQLAlchemy Configuration

