Intentando implementar la paginación basada en el cursor, y me gustaría saber la forma correcta de llamarlo con Knex para Postgres .
Aquí está la declaración estándar:
SELECT FROM WHERE (timestamp, id) > (cursor.age, cursor.id) ORDER BY timestamp ASC, id ASC LIMIT Y mi intento con Knex :
const knexResult = await knex({ 'table_name' }) .select(columns) .where('created_at', '>', cursor.timestamp) .andWhere('id', '>', cursor.id) .orderBy(['timestamp', 'id']) .limit(first) return knexResult; ¿Es esta la forma correcta de llamarlo? Parece que no es correcto... Estoy tratando de evitar knex.raw
Editar
El estándar SQL para la sentencia (x,y) > (a,b) es verdadero si:
(x > a or (x = a and y > b)) El código anterior no da resultados porque creo que está tratando de hacer coincidir ambas cláusulas where .
Puede implementar esta condición booleana (x > a or (x = a and y > b)) con knex.
const knexResult = await knex({ 'table_name' }) .select(columns) .where('created_at', '>', cursor.timestamp) .orWhere((inner) => inner.where('created_at', '=', cursor.timestamp) .andWhere('id', '>', cursor.id) ) .orderBy(['timestamp', 'id']) .limit(first); return knexResult;Producirá:
Select `col1`, `col2` from `table_name` where `created_at` > '12323112' or (`created_at` = '12323112' and id > '23') Order by `timestamp`, `id` Limit 1