ในบทความนี้เราจะมาเรียนรู้และสอนการใช้งาน Python (Flask) ร่วมกันกับ flask-SQLAlchemy ซึ่งเป็นตัว ORM ไลบรารี่ ของ Flask ในการเชื่อมต่อฐานข้อมูลโดยไม่ต้องเขียนโค้ดภาษา SQL แม้แต่สักบรรทัดเดียว ช่วยสร้าง Productivity และทำให้สามารถพัฒนาโปรเจคท์ได้อย่างรวดเร็ว นอกจากใช้ ORM แล้ว ยังจะพาไปรู้จัก SQLite ซึ่งเป็น Database ที่เบาหวิว พัฒนาโปรเจคท์ได้รวดเร็ว และ DB Browser ซึ่งเป็นโปรแกรมที่ใช้สำหรับเปิดใช้งาน จัดการฐานข้อมูลของ SQLite และตบท้ายด้วย PostgreSQL เผื่อท่านใดที่ต้องการใช้ร่วมกับฐานข้อมูลระดับโปรดักชั่น
เริ่มต้นสร้างโปรเจคท์ผ่าน PyCharm โดยเปิดขึ้นมาแล้วทำการคลิ๊ก File > New Project...
เริ่มต้นสร้างโปรเจคท์
จากนั้นทำการตั้งชื่อโปรเจคท์ โดยในบทความนี้ใช้ชื่อว่า flask-orm-alchemy
ตั้งชื่อโปรเจคท์ตามต้องการ ในที่นี้ใช้ flask-orm-alchemy
รอ PyCharm ทำการ Generate โปรเจคท์และสร้าง Virtual Environment สักครู่ จะเห็นว่าตัว PyCharm IDE นั้นค่อนข้างที่จะสะดวก ไม่ต้องสร้าง Virtual Environment เอง เพราะ PyCharm สร้างให้อัตโนมัติ โดยมีชื่อว่า (venv)
สร้างไพธอนไฟล์ขึ้นมาใหม่ โดยมีชื่อไฟล์ว่า app.py
ทำการติดตั้ง flask เสียก่อนในลำดับแรก
pip install flask
จากนั้นทำการเขียนโค้ดตามด้านล่างเพื่อทดสอบรันแสดงผล 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)
สร้างตารางในรูปแบบของ Object Relational Mapping (ORM) โดยที่ไม่ต้องเขียน SQL ตามที่ได้กล่าวไว้ด้านบน ซึ่งข้อดีและข้อเสียหลัก ๆ เอาไว้ประกอบการพิจารณาเลยก็คือ
ทำการติดตั้ง flask-sqlalchemy ซึ่งเป็นไลบรารี่ที่เอาไว้ใช้สำหรับเชื่อมต่อ Flask กับ SQLAlchemy
pip install flask_sqlalchemy
SQLite เป็นฐานข้อมูลที่เก็บข้อมูลในรูปแบบของ text file ในรูปแบบของไฟล์ ๆ เดียว (Single File) แต่สามารถสร้างตารางหลาย ๆ ตารางได้ และไม่ต้องทำการติดตั้งให้ยุ่งยากเพราะเป็น Builtin Library ที่มีมาให้กับไพธอนเรียบร้อย ขอยกเอาข้อดี ข้อเสียของ SQLite มาให้อ่านคร่าว ๆ กันครับ
กำหนด 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)
ไปที่ 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 ถูกสร้างขึ้นมา
ตอนนี้สามารถสร้าง 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
เปิดไฟล์ Database ตาม path ที่อยู่ของโปรเจคท์ ซึ่งจะอยู่ในโฟลเดอร์ PycharmProjects ทำการ เปิด
เปิดไฟล์ test.db เพื่ออิมพอร์ตเข้ามาใช้งาน
ในฐานข้อมูลจะปรากฏตารางที่ได้ทำการสร้างไว้เสร็จสิ้นเรียบร้อย 1 ตารางก็คือตาราง user
จะพบกับตาราง user
ตาราง user ยังเป็นตารางเปล่า ๆ ยังไม่ได้เพิ่มข้อมูลใด ๆ เข้ามา
สำหรับท่านใดที่ต้องการใช้ 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
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
กิจกรรมที่กำลังจะมาถึง
ไม่พลาดกิจกรรมเด็ด ๆ ที่น่าสนใจ
Event นี้จะเริ่มขึ้นใน April 25, 2023
รายละเอียดเพิ่มเติม/สมัครเข้าร่วมคอร์สเรียนไพธอนออนไลน์ที่เราได้รวบรวมและได้ย่อยจากประสบการณ์จริงและเพื่อย่นระยะเวลาในการเรียนรู้ ลองผิด ลองถูกด้วยตัวเองมาให้แล้ว เพราะเวลามีค่าเป็นอย่างยิ่ง พร้อมด้วยการซัพพอร์ตอย่างดี