Как проверить ссылочную целостность в Цербере? - PullRequest
1 голос
/ 21 апреля 2019

Рассмотрим следующую схему Цербера:

{
  'employee': {
    'type': 'list',
    'schema': {
      'type': 'dict',
      'schema': {
        'id': {'required': True, 'type': 'integer'},
        'name': {'required': True, 'type': 'string'}
      }
    }
  },
  'ceo-employee-id': {'required': True, 'type': 'integer'}
}

1) Как я могу проверить, что ceo-employee-id совпадает с одним из значений id в списке сотрудников? (Ссылочная целостность)

2) Как я могу проверить, что каждый идентификатор в списке сотрудников уникален (т. Е. Нет повторяющихся идентификаторов сотрудников)?

Я понимаю, что могу сделать это во время выполнения после проверки и анализа конфигурации, как предложено @rafael ниже. Мне интересно, смогу ли я сделать это с помощью функций проверки Цербера.

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Вам нужно будет использовать пользовательский валидатор , который реализует методы check_with, используйте свойство document в них и измените свою схему, включив в них следующие:

from cerberus import Validator


class CustomValidator(Validator):
    def _check_with_ceo_employee(self, field, value):
        if value not in (x["id"] for x in self.document["employee"]):
            self._error(field, "ID is missing in employee list.")

    def _check_with_employee_id_uniqueness(self, field, value):
        all_ids = [x["id"] for x in self.document["employee"]]
        if len(all_ids) != len(set(all_ids)):
            self._error(field, "Employee IDs are not unique.")


validator = CustomValidator({
    'employee': {
        'type': 'list',
        'schema': {
            'type': 'dict',
            'schema': {
                'id': {'required': True, 'type': 'integer'},
                'name': {'required': True, 'type': 'string'}
             },
        },
        'check_with': 'employee_id_uniqueness'
    },
    'ceo-employee-id': {'required': True, 'type': 'integer', 'check_with': 'ceo_employee'}
})

Указанный документ содержит подсказки по всем используемым здесь деталям.

(Я прошу прощения за любую ошибку отступа, которая могла появиться в примере.)

0 голосов
/ 21 апреля 2019

предполагая, что вы уже проверили схему вашего json, вы можете легко проверить два ваших условия, как это.Пусть doc будет вашим документом json.

employee_ids = [employee['id'] for employee in doc['employee']]
ceo_employee_id =  doc['ceo-employee-id']

1) Как я могу проверить, что ceo-employee-id соответствует одному из значений id в списке сотрудников?(Ссылочная целостность)

ceo_id_exists_in_employees = any([employee_id == ceo_employee_id for employee_id in employee_ids])

2) Как я могу проверить, что каждый идентификатор в списке сотрудников уникален (т. Е. Нет повторяющихся идентификаторов сотрудников)?

employee_id_is_unique = len(set(employee_ids)) == len(employee_ids)

3) Утверждать, что обазначения истинны

if ceo_id_exists_in_employees and employee_id_is_unique:
    print('passed')
else:
    print('failed')
...