Как сравнить sql против JSON в Python - PullRequest
2 голосов
/ 15 мая 2019

У меня следующая проблема. У меня есть класс User упрощенный пример:

class User:
    def __init__(self, name, lastname, status, id=None):
        self.id = id
        self.name = name
        self.lastname = lastname
        self.status = status
    def set_status(self,status)
         # call to the api to change status

    def get_data_from_db_by_id(self)
         # select data from db where id = self.id
    def __eq__(self, other):
        if not isinstance(other, User):
            return NotImplemented
        return (self.id, self.name, self.lastname, self.status) == \
           (other.id, other.name, other.lastname, other.status)

И у меня есть структура базы данных, такая как:

id, name, lastname, status 
1, Alex, Brown, free

И ответ json от API:

{
    "id": 1,
    "name": "Alex",
    "lastname": "Brown",
    "status": "Sleeping"
}

Мой вопрос:

Какой лучший способ сравнить ответы json и sql?
Зачем? - это только для целей тестирования - я должен убедиться, что API правильно изменил БД.

Как я могу десериализовать результаты Json и DB в один класс? Есть ли общие / лучшие практики?

Пока что я пытаюсь использовать marshmallow для json и sqlalchemy для DB, но мне не повезло с этим.

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Если вы используете SQLAlchemy для базы данных, я бы рекомендовал использовать SQLAthanor (полное раскрытие: я автор библиотеки).

SQLAthanor - это библиотека сериализации и десериализации для SQLAlchemy, которая позволяет настраивать надежные правила для сериализации / десериализации экземпляров модели в JSON. Один из способов проверки вашего экземпляра и JSON на эквивалентность - выполнить следующую логику в вашем коде Python:

Сначала сериализуйте ваш экземпляр БД в JSON. Используя SQLAthanor, вы можете сделать это так же просто, как:

instance_as_json = my_instance.dump_to_json()

Это возьмет ваш экземпляр и выведет все его атрибуты в строку JSON. Если вам нужен более детальный контроль над тем, какие атрибуты модели попадают в ваш JSON, вы также можете использовать my_instance.to_json(), который учитывает правила конфигурации, применяемые к вашей модели.

Получив сериализованную строку JSON, вы можете использовать Validator-Collection для преобразования строк JSON в dicts, а затем проверить, эквивалентен ли ваш экземпляр dict (из строки JSON вашего экземпляра) JSON от API (полное раскрытие: я также являюсь автором библиотеки Validator-Collection):

from validator_collection import checkers, validators

api_json_as_dict = validators.dict(api_json_as_string)
instance_json_as_dict = validators.dict(instance_as_json)

are_equivalent = checkers.are_dicts_equivalent(instance_json_as_dict, api_json_as_dict)

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

Вот несколько ссылок, которые могут вам пригодиться:

Надеюсь, это поможет!

0 голосов
/ 15 мая 2019

Преобразовать строку базы данных в словарь:

    def row2dict(row):
        d = {}
        for column in row.__table__.columns:
            d[column.name] = str(getattr(row, column.name))

        return d

Затем преобразуйте строку json в словарь:

    d2 = json.loads(json_response)

И, наконец, сравните:

    d2 == d
...