From 941aea49a86259f9a7b71650549b3a2f579bbf9a Mon Sep 17 00:00:00 2001 From: Achim Rohn Date: Fri, 12 Sep 2025 01:24:09 +0200 Subject: [PATCH] Add a pagination example --- schema/ent/example/start.go | 61 ++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/schema/ent/example/start.go b/schema/ent/example/start.go index acd0090..b83c764 100644 --- a/schema/ent/example/start.go +++ b/schema/ent/example/start.go @@ -3,15 +3,18 @@ package main import ( "context" "ersteller-lib/schema/ent/example/ent" + "ersteller-lib/schema/ent/example/ent/user" "log" "time" + "entgo.io/ent/dialect/sql" _ "github.com/mattn/go-sqlite3" ) func main() { //client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1") - client, err := ent.Open("sqlite3", "/tmp/ersteller_ent_example.db?_fk=1") + client, err := ent.Open("sqlite3", "/tmp/ersteller_ent_example.db?_fk=1", + ent.Log(log.Println), ent.Debug()) if err != nil { log.Fatalf("failed opening connection to sqlite: %v", err) } @@ -31,11 +34,59 @@ func main() { } log.Println("user was created: ", u) - time.Sleep(time.Second * 1) - u, err = client.User.UpdateOneID(u.ID).SetPassword("wtf").Save(ctx) + //time.Sleep(time.Second * 1) + //u, err = client.User.UpdateOneID(u.ID).SetPassword("wtf").Save(ctx) + //if err != nil { + // log.Fatalf("failed updating user: %w", err) + //}j + //log.Println("user was updated", u) + users, nextId, hasNext, err := ListUsersAfterID(ctx, client, 0, 2) if err != nil { - log.Fatalf("failed updating user: %w", err) + log.Fatalf("failed listing users: %w", err) + } + if hasNext { + log.Println("next id", nextId) + for _, u := range users { + log.Println("user", u.ID, u.Email, u.Password) + } + } + users, nextId, hasNext, err = ListUsersAfterID(ctx, client, nextId, 2) + if err != nil { + log.Fatalf("failed listing users: %w", err) + } + if hasNext { + log.Println("2 next id", nextId) + for _, u := range users { + log.Println("2 user", u.ID, u.Email, u.Password) + } } - log.Println("user was updated", u) } + +// afterID is the last ID from the previous page. Use 0 for the first page. +func ListUsersAfterID(ctx context.Context, client *ent.Client, afterID, limit int) ([]*ent.User, int, bool, error) { + q := client.User.Query(). + Order(user.ByID(sql.OrderAsc())). + Limit(limit + 1) // fetch one extra to detect "has next" + + if afterID > 0 { + q = q.Where(user.IDGT(afterID)) + } + + rows, err := q.All(ctx) + if err != nil { + return nil, -1, false, err + } + + hasNext := len(rows) > limit + if hasNext { + rows = rows[:limit] + } + + var next int + if len(rows) > 0 { + last := rows[len(rows)-1].ID + next = last + } + return rows, next, hasNext, nil +}