ใน Django 2.1 ฉันต้องการโหลดบางรุ่น (เช่นชื่อประเทศเป็นต้น) พร้อมข้อมูลเริ่มต้น
แต่ฉันต้องการให้สิ่งนี้เกิดขึ้นโดยอัตโนมัติทันทีหลังจากดำเนินการย้ายข้อมูลครั้งแรก
ดังนั้นฉันจึงคิดว่ามันจะเป็นการดีที่จะมีsql/
โฟลเดอร์ในแต่ละแอปพลิเคชันที่ต้องโหลดข้อมูลเริ่มต้น
จากนั้นภายในsql/
โฟลเดอร์นั้นฉันจะมี.sql
ไฟล์ที่มี DML ที่จำเป็นเพื่อโหลดข้อมูลเริ่มต้นลงในโมเดลที่เกี่ยวข้องเช่น:
INSERT INTO appName_modelName(fieldName)
VALUES
("country 1"),
("country 2"),
("country 3"),
("country 4");
เพื่อให้อธิบายได้ชัดเจนยิ่งขึ้นนี่คือลักษณะของแอพที่มีsql/
โฟลเดอร์:
นอกจากนี้ฉันพบบางกรณีที่ฉันต้องการให้sql
สคริปต์ดำเนินการตามลำดับที่ระบุ ดังนั้นฉันจึงตัดสินใจที่จะนำหน้าชื่อไฟล์ด้วยหมายเลขติดต่อกันดังที่เห็นในภาพด้านบน
แล้วฉันจำเป็นต้องมีวิธีในการโหลดใด ๆSQLs
ที่มีอยู่ในโฟลเดอร์โปรแกรมใด ๆ python manage.py migrate
โดยอัตโนมัติด้วยการทำ
ดังนั้นฉันจึงสร้างแอปพลิเคชั่นอื่นที่ชื่อinitial_data_migrations
แล้วเพิ่มแอพนี้ในรายการINSTALLED_APPS
ในsettings.py
ไฟล์ จากนั้นฉันก็สร้างmigrations
โฟลเดอร์ภายในและเพิ่มไฟล์ชื่อrun_sql_scripts.py
( ซึ่งจริงๆแล้วเป็นการโอนย้ายแบบกำหนดเอง ) ดังที่เห็นในภาพด้านล่าง:
ฉันสร้างขึ้นrun_sql_scripts.py
เพื่อให้ดูแลการเรียกใช้sql
สคริปต์ทั้งหมดที่มีอยู่ในแต่ละแอปพลิเคชัน python manage.py migrate
หนึ่งนี้เป็นเชื้อเพลิงแล้วเมื่อมีคนวิ่ง แบบกำหนดเองmigration
นี้ยังเพิ่มแอปพลิเคชันที่เกี่ยวข้องเป็นการอ้างอิงด้วยวิธีนี้จะพยายามเรียกใช้sql
คำสั่งหลังจากที่แอปพลิเคชันที่จำเป็นได้ดำเนินการ0001_initial.py
ย้ายข้อมูลแล้วเท่านั้น (เราไม่ต้องการพยายามเรียกใช้คำสั่ง SQL กับตารางที่ไม่มีอยู่จริง)
นี่คือที่มาของสคริปต์นั้น:
import os
import itertools
from django.db import migrations
from YourDjangoProjectName.settings import BASE_DIR, INSTALLED_APPS
SQL_FOLDER = "/sql/"
APP_SQL_FOLDERS = [
(os.path.join(BASE_DIR, app + SQL_FOLDER), app) for app in INSTALLED_APPS
if os.path.isdir(os.path.join(BASE_DIR, app + SQL_FOLDER))
]
SQL_FILES = [
sorted([path + file for file in os.listdir(path) if file.lower().endswith('.sql')])
for path, app in APP_SQL_FOLDERS
]
def load_file(path):
with open(path, 'r') as f:
return f.read()
class Migration(migrations.Migration):
dependencies = [
(app, '__first__') for path, app in APP_SQL_FOLDERS
]
operations = [
migrations.RunSQL(load_file(f)) for f in list(itertools.chain.from_iterable(SQL_FILES))
]
ฉันหวังว่าใครบางคนจะพบว่าสิ่งนี้เป็นประโยชน์มันใช้งานได้ดีสำหรับฉัน!. หากคุณมีคำถามใด ๆ โปรดแจ้งให้เราทราบ
หมายเหตุ: นี่อาจไม่ใช่วิธีแก้ปัญหาที่ดีที่สุดเนื่องจากฉันเพิ่งเริ่มต้นใช้งาน django แต่ก็ยังอยากจะแบ่งปัน "วิธีการ" นี้กับทุกคนเนื่องจากฉันไม่พบข้อมูลมากนักในขณะที่ googling เกี่ยวกับเรื่องนี้