ใช้งาน Flask ร่วมกับ SQLAlchemy เพื่อเชื่อมต่อฐานข้อมูลโดยใช้ ORM

ใช้งาน Flask ร่วมกับ SQLAlchemy เพื่อเชื่อมต่อฐานข้อมูลโดยใช้ ORM

ในบทความนี้เราจะมาเรียนรู้และสอนการใช้งาน Python (Flask) ร่วมกันกับ flask-SQLAlchemy ซึ่งเป็นตัว ORM ไลบรารี่ ของ Flask ในการเชื่อมต่อฐานข้อมูลโดยไม่ต้องเขียนโค้ดภาษา SQL แม้แต่สักบรรทัดเดียว ช่วยสร้าง Productivity และทำให้สามารถพัฒนาโปรเจคท์ได้อย่างรวดเร็ว นอกจากใช้ ORM แล้ว ยังจะพาไปรู้จัก SQLite ซึ่งเป็น Database ที่เบาหวิว พัฒนาโปรเจคท์ได้รวดเร็ว และ DB Browser ซึ่งเป็นโปรแกรมที่ใช้สำหรับเปิดใช้งาน จัดการฐานข้อมูลของ SQLite และตบท้ายด้วย PostgreSQL เผื่อท่านใดที่ต้องการใช้ร่วมกับฐานข้อมูลระดับโปรดักชั่น

จุดประสงค์

Software & Tools

ลิ้งค์ YouTube แนะนำ

เริ่มต้นสร้าง 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 และบทความแนะนำ

จากนั้นทำการเขียนโค้ดตามด้านล่างเพื่อทดสอบรันแสดงผล 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)

ข้อดี

ข้อเสีย

ทำการติดตั้ง flask-sqlalchemy ซึ่งเป็นไลบรารี่ที่เอาไว้ใช้สำหรับเชื่อมต่อ Flask กับ SQLAlchemy

pip install flask_sqlalchemy

SQLite

SQLite เป็นฐานข้อมูลที่เก็บข้อมูลในรูปแบบของ text file ในรูปแบบของไฟล์ ๆ เดียว (Single File) แต่สามารถสร้างตารางหลาย ๆ ตารางได้ และไม่ต้องทำการติดตั้งให้ยุ่งยากเพราะเป็น Builtin Library ที่มีมาให้กับไพธอนเรียบร้อย ขอยกเอาข้อดี ข้อเสียของ SQLite มาให้อ่านคร่าว ๆ กันครับ

ข้อดีข้อเสียของ SQLite

ข้อดี

ข้อเสีย

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 และบทความแนะนำ

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

Flask SQLAlchemy Configuration

SQLite

แนะนำ 📒Python Web Development with Flask (Full-Course)