Django 2.1'de bazı modelleri (örneğin ülke adları gibi) ilk verilerle yüklemek istedim.
Ancak bunun ilk geçişlerin yürütülmesinden hemen sonra otomatik olarak gerçekleşmesini istedim.
Bu yüzden sql/
her uygulamada ilk verilerin yüklenmesini gerektiren bir klasörün olması harika olur diye düşündüm .
Daha sonra bu sql/
klasörün içinde .sql
, ilk verileri ilgili modellere yüklemek için gerekli DML'lere sahip dosyalara sahip olurdum, örneğin:
INSERT INTO appName_modelName(fieldName)
VALUES
("country 1"),
("country 2"),
("country 3"),
("country 4");
Daha açıklayıcı olmak gerekirse, sql/
klasör içeren bir uygulama şu şekilde görünür:
Ayrıca, sql
komut dosyalarının belirli bir sırada çalıştırılmasına ihtiyaç duyduğum bazı durumlar buldum . Bu nedenle, yukarıdaki resimde görüldüğü gibi dosya adlarının önüne ardışık bir sayı koymaya karar verdim.
Ardından, SQLs
herhangi bir uygulama klasörünün içindeki mevcut herhangi birini yaparak otomatik olarak yüklemek için bir yola ihtiyacım vardı python manage.py migrate
.
Bu yüzden adında başka bir uygulama yarattı initial_data_migrations
ve sonra ben listesine bu uygulama ekledi INSTALLED_APPS
içinde settings.py
dosyanın. Sonra migrations
içinde bir klasör oluşturdum ve run_sql_scripts.py
( Aslında özel bir geçiş ) adlı bir dosya ekledim . Aşağıdaki resimde görüldüğü gibi:
Her uygulamada mevcut olan run_sql_scripts.py
tüm sql
komut dosyalarını çalıştıracak şekilde oluşturdum . Bu daha sonra biri koştuğunda ateşleniyor python manage.py migrate
. Bu özel migration
, ilgili uygulamaları bağımlılıklar olarak da ekler, böylece sql
ifadeleri yalnızca gerekli uygulamalar 0001_initial.py
geçişlerini gerçekleştirdikten sonra çalıştırmayı dener (Var olmayan bir tabloya karşı bir SQL ifadesi çalıştırmayı denemek istemiyoruz).
İşte o komut dosyasının kaynağı:
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))
]
Umarım birisi bunu yararlı bulur, benim için gayet iyi çalıştı !. Herhangi bir sorunuz varsa lütfen bana bildirin.
NOT: Bu, django'ya yeni başladığım için en iyi çözüm olmayabilir, ancak bu konuda Google'da çok fazla bilgi bulamadığım için bu "Nasıl Yapılır" ı yine de sizinle paylaşmak istedim.