package main import ( "context" "fmt" "os" "time" "github.com/jackc/pgx/v5" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() appConn, err := pgx.Connect(ctx, "postgres://postgres:zhang520..@117.72.182.135:5432/app?sslmode=disable") must(err) defer appConn.Close(ctx) allappConn, err := pgx.Connect(ctx, "postgres://postgres:zhang520..@117.72.182.135:5432/allapp?sslmode=disable") must(err) defer allappConn.Close(ctx) fmt.Println("app.finance_record joined with categories:") rows, err := appConn.Query(ctx, ` select r.id, r.space_id, r.category_id, c.name, c.icon, c.type, r.amount, r.remark, r.record_time, r.create_by, r.create_time, r.update_by, r.update_time from finance_record r join finance_category_space c on c.id = r.category_id order by r.id `) must(err) defer rows.Close() for rows.Next() { var id, spaceID, categoryID, createBy, updateBy int64 var name, icon string var typ int16 var amount string var remark *string var recordTime *time.Time var createTime, updateTime *time.Time must(rows.Scan(&id, &spaceID, &categoryID, &name, &icon, &typ, &amount, &remark, &recordTime, &createBy, &createTime, &updateBy, &updateTime)) fmt.Printf("- id=%d space=%d cat=%d %s/%s/type=%d amount=%s remark=%v record=%v create_by=%d update_by=%d\n", id, spaceID, categoryID, name, icon, typ, amount, remark, datePtr(recordTime), createBy, updateBy) } must(rows.Err()) fmt.Println("\napp spaces:") printRows(ctx, appConn, `select id, name, invite_code, owner_id from space order by id`) fmt.Println("\nallapp families:") printRows(ctx, allappConn, `select id, name, invite_code, owner_id from b_family order by id`) fmt.Println("\ncategory name/type/icon matches:") rows, err = appConn.Query(ctx, ` select distinct c.name, c.icon, c.type from finance_record r join finance_category_space c on c.id = r.category_id order by c.type, c.name, c.icon `) must(err) defer rows.Close() for rows.Next() { var name, icon string var typ int16 must(rows.Scan(&name, &icon, &typ)) var id int64 err := allappConn.QueryRow(ctx, ` select id from b_finance_category where name = $1 and icon = $2 and type = $3 order by id limit 1 `, name, icon, typ).Scan(&id) if err != nil { fmt.Printf("- %s/%s/type=%d -> NO MATCH (%v)\n", name, icon, typ, err) continue } fmt.Printf("- %s/%s/type=%d -> allapp category id=%d\n", name, icon, typ, id) } must(rows.Err()) } func printRows(ctx context.Context, conn *pgx.Conn, sql string) { rows, err := conn.Query(ctx, sql) must(err) defer rows.Close() for rows.Next() { vals, err := rows.Values() must(err) fmt.Printf("- %v\n", vals) } must(rows.Err()) } func datePtr(t *time.Time) any { if t == nil { return nil } return t.Format("2006-01-02") } func must(err error) { if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }