Accessing Django ORM from External Python Script
ใช้ Python Script เข้าถึงข้อมูลผ่าน Django ORM
ในการพัฒนาระบบและในบางกรณีที่เราจำเป็นต้องดึงข้อมูลจากตัว Django แอพพลิเคชั่นเลย โดยที่เราไม่ได้เข้าไปแก้โค้ดในนั้น ทางเลือกหนึ่งคือเราสามารถเขียนสคริปขึ้นมาต่อกับฐานข้อมูลไปได้เลย แต่ว่าการเชื่อมต่อกับฐานข้อมูลตรงๆ ก็มีความเสี่ยงอยู่ เช่นถ้าเราเกิดไปทำอะไรขึ้นมาเพี้ยนๆ ระบบนั้นๆ อาจจะล่มได้โดยง่าย 😅
ทีนี้ก็มีอีกทางเลือกหนึ่งที่เราสามารถไปยืมใช้ความสามารถของ Django ORM ได้เช่นกัน (แต่ก็ไม่ใช่วิธีที่ดีที่สุดนะ แล้วแต่สถานการณ์นะครับ) เราเขียนสคริปอย่างไรได้บ้าง?
ก่อนอื่น แน่นอนครับ เราก็ต้อง Import ตัว Django เข้ามาก่อน
import django
จากนั้นเราก็ต้องเซตตัว sys.path
ก่อน เพื่อให้ Python หาโปรเจค Django ของเราให้เจอ
import os
import sys
# Add the project to sys.path, so that Python can find packages
PROJECT_ROOT = os.path.join(os.path.dirname(__file__), "testing_django")
sys.path.append(PROJECT_ROOT)
ในที่นี้สคริปที่ผมสร้างขึ้นจะอยู่ข้างๆ กับโปรเจค Django ที่ชื่อ testing_django
เลยนะครับ ถ้าของใครวางอยู่ Path อื่น ก็แก้ตัวแปร PROJECT_ROOT
กันด้วยนะ
หลังจากที่เราเซตให้ Python หาโปรเจค Django เราเจอแล้ว เราก็ต้องเซคค่า DJANGO_SETTINGS_MODULE
ด้วยนะ เพื่อให้ Django รู้ว่ามันจะต้องไปหา Settings ตัวไหน
# Set up the Django environment
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testing_django.settings")
django.setup()
เท่านี้ก็เป็นอันเสร็จครับ เราสามารถเรียกใช้ Django ORM ได้แล้ว
from categories.models import Category
categories = Category.objects.all()
for index, each in enumerate(categories, start=1):
print(f"{index}. {each.name}")
ขอมาย้ำอีกทีนะครับ ว่าการเชื่อมต่อฐานข้อมูลโดยตรง หรือว่าการเข้าถึงอะไรตรงๆ มันก็มีความเสี่ยงอยู่ ให้เลือกใช้ในกรณีที่จำเป็น แล้วถ้าจะให้ดีก็เขียน ADRs ไว้ด้วย เผื่อคนเข้ามาดูทีหลังจะได้ไม่ด่า 😂
โค้ดตัวอย่างเต็มๆ สามารถตามไปดูได้ที่ GitHub นะครับ 😊