Django Fixtures: раздача баз данных

Django Fixtures: раздача баз данных

S0mebody


Когда мы создаем приложение или проект в Django, нам нужно будет протестировать функции приложения. Лучший способ тестирования это использовать реалистичные данные, которые что-то значат для разработчика. Так мы сможем лучше понять, как на самом деле работает приложение. Итак, нам понадобятся данные в нашей базе данных; но если мы создаем приложение с нуля, данные могут быть недоступны, и база данных будет полностью пустой. Даже если у нас есть более старые базы данных, нам может потребоваться перенести наши данные в более новую. Вот тогда в игру вступают Fixtures.


Fixtures это наборы данных, которые Django может прочитать и загрузить в свою базу данных. Fixtures также можно использовать или создавать для хранения существующих данных. Итак, по сути, fixtures это способ для Django экспортировать и импортировать данные в базу данных. Хотя есть пакеты, которые могут в этом помочь, например django-seed, мы сделаем это вручную.


Поддерживаемые форматы и структуры данных

В настоящее время Django поддерживает три формата:

  1. JSON
  2. XML
  3. YAML

Django ожидает, что фикстуры (fixtures) будут следовать определенному шаблону. Любой другой шаблон приведет к ошибке. Для JSON шаблон будет следующим:

# Это из официальной документации

[
  {
    "model": "myapp.person",
    "pk": 1,
    "fields": {
      "first_name": "John",
      "last_name": "Lennon"
    }
  },
  {
    "model": "myapp.person",
    "pk": 2,
    "fields": {
      "first_name": "Paul",
      "last_name": "McCartney"
    }
  }
]

Давайте посмотрим, что это значит. Прежде всего это массив. Затем фигурные скобки и пары ключ-значение указывают на то, что объекты внутри массива являются JSON объектам. Тогда каждый из объектов имеет ровно три ключа: model, pk и fields. model указывает, где находится модель, в области видимости приложения: <app_name>. <model_name>. pk указывает, каким будет значение первичного ключа (primary key). В качестве первичного ключа я использовал UUID v4. Итак, я использовал этот сайт, чтобы вручную сгенерировать для меня UUID. Есть много других сайтов, которые позволяют вам сгенерировать кучу UUID за один раз. Обратите внимание: если вы используете UUID, его значение должно быть указано в кавычках. Наконец, поля fields содержит все имена полей и их соответствующие значения. Вот и все.


Эту же информацию можно поместить в YAML, и это будет выглядеть следующим образом:

- model: myapp.person
  pk: 1
  fields:
    first_name: John
    last_name: Lennon
- model: myapp.person
  pk: 2
  fields:
    first_name: Paul
    last_name: McCartney


XML fixtures немного отличается от JSON и YML, кроме того, что это XML, он должен иметь некоторые дополнительные метаданные. Например: номер версии с django-objects и тип значения в поле. Те же данные, которые мы уже видели, будут выглядеть в XML следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<django-objects version="1.0">
    <object pk="1" model="myapp.person">
        <field type="CharField" name="first_name">John</field>
        <field type="CharField" name="last_name">Lennon</field>
    </object>
    <object pk="2" model="myap.person">
        <field type="CharField" name="first_name">Paul</field>
        <field type="CharField" name="last_name">McCartney</field>
    </object>
</django-objects>


Расположение fixture

Django может найти фикстуры в проекте тремя способами:

  1. Область действии приложении: по умолчанию Django ищет директорию fixtures внутри приложения. Чтобы это сработало, нам нужно создать новую директорию внутри приложения и назвать ее fixtures. Затем мы можем сохранить наши фикстуры, относящиеся к этому приложению, в этой директории.
  2. Область действии проекта: мы также можем хранить все наши фикстуры на уровне проекта. Для этого нам потребуется создать каталог под названием fixtures на корневом уровне проекта. Затем нам нужно добавить настройки FIXTURE_DIRS в наш файл settings.py, чтобы указать места, где хранятся фикстуры. Django будет искать местоположения, указанные с помощью этого параметра, в дополнение к каталогам в области приложения. Это выглядело бы так:
FIXTURE_DIRS = [
    'fixtures',
]

Обратите внимание, что параметр FIXTURE_DIRS ожидает список местоположений.


  1. Командная строка: мы также можем указать Django выполнить поиск в определенном месте или файле, добавив параметр в команду, которую мы будем запускать для загрузки данных. Например:
python manage.py loaddata location/to/your/data.json


Команды

До сих пор мы говорили в основном о загрузке данных в базу данных, но мы также можем автоматически сгенерировать фикстуры, если у нас уже есть некоторые данные в базе данных. Итак, в основном есть две команды для работы с fixtures:


Загрузка данных

loaddata используется для загрузки данных в базу данных. Есть несколько способов сделать это:

# укажите расположение файла, имя и расширение
python manage.py loaddata location/to/the/file/data.json

# укажите имя файла и расширение
python manage.py loaddata data.json

# укажите только имя файла
python manage.py loaddata data

Я считаю, что это потребует небольшого объяснения. В первой команде мы указали путь, имя файла и расширение. Django будет искать этот файл во всех директориях fixture, которые мы определили ранее. Итак, если у нас есть каталог fixtures в корне нашего проекта, с помощью этой команды Django будет искать структуру директориях (расположение/в/файл/) и имя файла внутри этой структуры с соответствующим расширением.

Во второй команде нет пути; поэтому Django будет искать имя файла и расширение в любом из указанных мест.

В третьей команде Django будет искать любой файл с именем файла в указанных местах. В этом случае расширения не имеют значения. Отметим, что если мы укажем расширение фикстуры, Django сначала вызовет конкретный сериализатор для десериализации данных. Если мы не укажем расширение, Django сначала будет искать файл и вызывать сериализатор на основе расширения найденного файла.


Есть параметры, которые мы можем добавить к нашей команде loaddata:

  • --database <db_name>: указывает базу данных, в которую будут загружены данные. По умолчанию будет использоваться база данных указанная в файле settings.py.
  • --app <app_name>: указывает приложению, где искать фикстуры
  • --format <format_name>: указывает формат сериализации (json/xml/yaml)
  • --exclude <file_name>: указывает любой файл, который следует исключить из загрузки


Сброс данных

dumpdata используется для создания фикстур. Команда будет выглядеть примерно так:

python manage.py dumpdata <app_label>.<model_name> <app_label>.<model_name> --format <format_name>

Я предполагаю, что команда довольно понятна. Нам нужно вызвать команду dumpdata с именем модели, привязанным к приложении, которое имеет модель. Мы также хотели бы указать формат, в котором мы хотим данные. Есть еще несколько вариантов, которые мы можем добавить этой командой:

  • --all или -a: выгружает все данные с помощью Django диспетчера моделей .
  • --indent <indent_size>: указывает размер отступа в целочисленном формате
  • --exclude <file_name>: указывает любое приложение или модель, которые следует исключить из дампа.
  • --database <db_name>: указывает имя базы данных
  • --pks [список первичных ключей]: указывает первичные ключи, которые будут сброшены. Применимо только для одной модели.
  • --output <имя_файла>: указывает имя файла, в который будут выгружены данные.


Исходные данные для всего проекта

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


Команда будет выглядеть так, как показано ниже, когда она загружает все файлы json в директорию fixtures:

python manage.py loaddata fixtures/*.json

Это решение взято из этого stackoverflow комментария.


Для дальнейшего чтения обратитесь к документации Django.

Report Page