Сопоставление результата SELECT непосредственно с предопределенным классом с помощью pg-promise

Предположим, у меня есть класс

class Dog {
    id: number
    legs: number
}

и таблица с теми же свойствами. Я использую pg-promise для запроса из базы данных следующим образом:

getDogs(): Promise<Dog[]> {
    return obj.any('SELECT id, legs FROM Dog')
}

и я хочу вызвать эту функцию следующим образом:

const dogs: Dog[] = await Database.getDogs()

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


person Mirt Hlaj    schedule 10.01.2018    source источник


Ответы (1)


Используйте для этого метод Database.map‹T=any›. :

getDogs(): Promise<Dog[]> {
    return obj.map<Dog>('SELECT id, legs FROM Dog', [], a => new Dog(a));
}

Ваш класс будет:

class Dog {
    constructor(row: any) {
        this.id = row.id;
        this.legs = row.legs;
    }
    id: number
    legs: number
}

Другие полезные ссылки:

person vitaly-t    schedule 10.01.2018
comment
Это также работает для объектов jsonb. Предположим, что у собаки есть какой-то подкласс со свойствами, которые хранятся как объект jsonb в базе данных? - person Mirt Hlaj; 10.01.2018
comment
Поскольку вы передаете абстрактный объект в конструктор, он может обрабатывать любую внутреннюю структуру, включая вложенные объекты JSON. И если вы хотите, чтобы ваш запрос возвращал правильные объекты JSON, см. этот вопрос: stackoverflow.com/questions/39805736/, т. е. вы можете создать любой объект JSON в SQL, используя функцию json_build_object;) - person vitaly-t; 10.01.2018