Django: команда Loaddata после сбоя syncdb - PullRequest
0 голосов
/ 16 июля 2011

Я пытаюсь использовать приборы как независимый от БД способ передачи данных в мою базу данных, но это гораздо сложнее, чем должно быть. Мне интересно, что я делаю не так ...

В частности, , когда я делаю syncdb, за которым следует миграция с последующей загрузкой данных У меня возникают проблемы, поскольку syncdb уже создает данные, которые loaddata пытается прочитать из дампа . Это приводит к двойным записям и, следовательно, к аварийному скрипту.

Кажется, это та же проблема, что и здесь: https://code.djangoproject.com/ticket/15926

Но мне странно, что это кажется игнорируемой проблемой. Разве приборы не предназначены для ввода реальных (живых) данных?

Если так: есть ли какой-нибудь Django-формат, предназначенный для этого? Или все просто сбрасывают данные как SQL? И если да, то как перенести данные разработки в SQLite в рабочую базу данных?

Ответы [ 2 ]

1 голос
/ 16 июля 2011

syncdb также будет загружать данные из приборов, если у вас есть приборы, названные правильно и в правильном месте. Смотрите эту ссылку для получения дополнительной информации.

https://docs.djangoproject.com/en/1.3/howto/initial-data/#automatically-loading-initial-data-fixtures

Если вы не хотите, чтобы данные загружались на каждом syncdb, вам нужно изменить имя прибора.

приборы - это хороший способ загрузить ваши данные, я использовал их в ряде проектов. В некоторых проектах, когда у меня есть тонна данных, я иногда пишу специальный скрипт загрузки, который будет брать данные из моего источника данных и загружать мои новые модели django, пользовательский скрипт немного больше работает, но дает вам больше гибкости.

Я стараюсь избегать использования sql для загрузки, если могу, поскольку SQL, как правило, зависит от БД, если вам приходится беспокоиться о загрузке в разных версиях базы данных, держитесь подальше, если можете.

"В общем, использование фикстуры - более чистый метод, поскольку он не зависит от базы данных, но исходный SQL также немного более гибок."

0 голосов
/ 16 июля 2011

ОП здесь;это то, что я до сих пор придумал:

# some_app/management/commands/delete_all_objects.py

from django.core.management.base import BaseCommand, CommandError
from django.db.models import get_models

class Command(BaseCommand):
    help = 'Deletes all objects'

    def handle(self, *args, **options):
        for model in get_models():
            model.objects.all().delete()

А затем просто запустите delete_all_objects между после syncdb & migrate и до loaddata.Я не уверен, что мне это нравится, я очень удивлен, что это необходимо, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...