Accessing Django ORM from External Python Script

ใช้ Python Script เข้าถึงข้อมูลผ่าน Django ORM

Photo by Azamat E on Unsplash

ในการพัฒนาระบบและในบางกรณีที่เราจำเป็นต้องดึงข้อมูลจากตัว 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 นะครับ 😊

--

--

Kan Ouivirach
PyCon Thailand — Host of PyConAPAC 2021

Data Craftsman. Passionate in software engineering, data engineering, and data science. ♥