Bonjour,
Dans le paramétrage d'une API REST avec PostgreSQL je compose des collections d'objets imbriquées en réponse à mes requêtes SQL sous cette forme*** :
Dans un pemier temps, j'avais procédé avec des requêtes SQL successives que je raccrochais les unes aux autres après coup, système très souple en dev' mais pas top pour les perfs je pense (selon les pages j'avais jusqu'à 4 requêtes) :
Désormais je ne crée qu'une seule requête qui me donne le même résultat :
Comme vous le voyez, pour arriver à mes fins j'utilise la fonction postgres `jsonb_build_object()` (j'aurais tout aussi bien pu utiliser `json_build_object()`), seulement il me faut redéfinir toutes les clefs pour chaque collections d'objets imbriquées, pas moyen de le faire à la volée...
Y-a-t-il mieux à faire ?
___
*** Ne vous étonnez pas si les dénominations des clefs de la réponse sont en camelCase alors que ces mêmes clefs sont en _snake_case dans les requêtes SQL : je leur fais subir un petit changement de syntaxe avec la fonction dataConversion().
Modifié par Olivier C (29 Mar 2024 - 15:24)
Dans le paramétrage d'une API REST avec PostgreSQL je compose des collections d'objets imbriquées en réponse à mes requêtes SQL sous cette forme*** :
{
id: 16,
name: 'Markdown test',
alternativeHeadline: 'Syntaxe markdown permettant de tester notre parseur',
slug: 'markdown-test',
content: 'normal, _italic_, __strong__',
createdAt: 2022-04-16T17:10:25.000Z,
modifiedAt: 2022-04-16T18:15:22.000Z,
type: null,
description: 'Syntaxe markdown à destination de notre parseur',
authorId: 1,
status: 1,
isRestrictedRead: true,
isCommentable: false,
medias: null,
add: null,
author: {
url: null,
prefix: 'P.',
suffix: 's.j.',
nickname: null,
givenName: 'Henri',
usualName: null,
familyName: 'de Lubac',
additionalName: 'Sonier'
}
}
Dans un pemier temps, j'avais procédé avec des requêtes SQL successives que je raccrochais les unes aux autres après coup, système très souple en dev' mais pas top pour les perfs je pense (selon les pages j'avais jusqu'à 4 requêtes) :
export async function getArticle(req, res) {
let data = {}
const client = await this.pg.connect()
const query = `
SELECT *
FROM __article
WHERE _slug = $1
`
const query2 = `
SELECT
__person._given_name,
__person._additional_name,
__person._family_name,
__person._usual_name,
__person._nickname,
__person._prefix,
__person._suffix,
__person._url
FROM __account
LEFT JOIN __person
ON __person._id = _person_id
WHERE __account._id = $1
`
try {
const article = await client.query(query, [req.params.slug])
if (!article.rows[0]) return res.code(404).view('404')
data = await dataConversion(article.rows[0])
const author = await client.query(query2, [data.authorId])
data.author = await dataConversion(author.rows[0])
modifyData(req, data)
console.log(data)
//return data
return res.view('article', { data })
} finally {
client.release()
}
}
Désormais je ne crée qu'une seule requête qui me donne le même résultat :
export async function getArticle(req, res) {
let data = {}
const client = await this.pg.connect()
const query = `
SELECT
a.*,
jsonb_build_object(
'_given_name', p._given_name,
'_additional_name', p._additional_name,
'_family_name', p._family_name,
'_usual_name', p._usual_name,
'_nickname', p._nickname,
'_prefix', p._prefix,
'_suffix', p._suffix,
'_url', p._url
) AS author
FROM __article a
LEFT JOIN __account ac ON a._author_id = ac._id
LEFT JOIN __person p ON ac._person_id = p._id
WHERE a._slug = $1
`
try {
const article = await client.query(query, [req.params.slug])
if (!article.rows[0]) return res.code(404).view('404')
data = await dataConversion(article.rows[0])
modifyData(req, data)
console.log(data)
//return data
return res.view('article', { data })
} finally {
client.release()
}
}
Comme vous le voyez, pour arriver à mes fins j'utilise la fonction postgres `jsonb_build_object()` (j'aurais tout aussi bien pu utiliser `json_build_object()`), seulement il me faut redéfinir toutes les clefs pour chaque collections d'objets imbriquées, pas moyen de le faire à la volée...
Y-a-t-il mieux à faire ?
___
*** Ne vous étonnez pas si les dénominations des clefs de la réponse sont en camelCase alors que ces mêmes clefs sont en _snake_case dans les requêtes SQL : je leur fais subir un petit changement de syntaxe avec la fonction dataConversion().
Modifié par Olivier C (29 Mar 2024 - 15:24)