supabase-community/postgrest-go
supabase-community/postgrest-go has 231 GitHub stars and 44 forks. Star changes are not measured yet. Last checked 2026-11-14 04:09 UTC. Last push 2026-11-10.
측정된 스타 증가
- in 24h
- 기록 수집 중
- in 7 days
- 기록 수집 중
- in 15 days
- 기록 수집 중
- in 1 month
- 기록 수집 중
서로 겹치는 기간의 순증가량이며 일별 합계가 아닙니다. 측정값이 없으면 비워 둡니다. 스타는 관심도를 나타내며 품질을 보장하지 않습니다.
소개
Isomorphic Go client for PostgREST.
데이터README.md
OriginalPostgrest GO
[!IMPORTANT] Update, September 2026:
This codebase is not being actively maintained by Supabase or the community, but it's not the end of the road... We're busy building an official Supabase SDK for Go that will make this repository and the module it publishes obsolete. This thread has more information, as well as providing a venue for discussion in the meantime.
Golang client for PostgREST. The goal of this library is to make an "ORM-like" restful interface.
Documentation
Full documentation can be found here.
Installation
go get github.com/supabase-community/postgrest-go
Version compatibility
go get without a version installs the latest tagged release (currently v0.0.12). The main branch has a newer API with generics, structured responses, and context-aware Execute methods.
| Install command | API |
|---|---|
go get github.com/supabase-community/postgrest-go |
v0.0.12 — Select(columns, count, head), Execute() returns ([]byte, int64, error) |
go get github.com/supabase-community/postgrest-go@main |
main — Select(columns, opts), Execute(ctx) returns *PostgrestResponse |
The examples below (except Basic usage v0.0.12) require the main branch:
go get github.com/supabase-community/postgrest-go@main
Quick Start
Basic usage (v0.0.12) {#basic-usage-v012}
If you installed the default release tag, use this API:
package main
import (
"encoding/json"
"fmt"
"github.com/supabase-community/postgrest-go"
)
func main() {
client := postgrest.NewClient("http://localhost:3000/rest/v1", "public", nil)
if client.ClientError != nil {
panic(client.ClientError)
}
data, count, err := client.From("users").Select("*", "", false).Execute()
if err != nil {
panic(err)
}
fmt.Printf("count: %d\n", count)
fmt.Println(string(data))
}
Basic Usage (main branch)
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/supabase-community/postgrest-go"
)
func main() {
// Create a new client
client := postgrest.NewClient("http://localhost:3000/rest/v1", "public", nil)
if client.ClientError != nil {
panic(client.ClientError)
}
// Select data
response, err := client.From("users").Select("*", nil).Execute(context.Background())
if err != nil {
panic(err)
}
if response.Error != nil {
panic(response.Error)
}
// Print results
data, _ := json.Marshal(response.Data)
fmt.Println(string(data))
}
Select with Filters
// Select with filters
opts := &postgrest.SelectOptions{Count: "exact"}
response, err := client.
From("users").
Select("id, name, email", opts).
Eq("status", "active").
Limit(10, nil).
Order("name", &postgrest.OrderOptions{Ascending: true}).
Execute(context.Background())
Insert Data
// Insert a single row
insertOpts := &postgrest.InsertOptions{Count: "exact"}
response, err := client.
From("users").
Insert(map[string]interface{}{
"name": "John Doe",
"email": "[email protected]",
}, insertOpts).
Execute(context.Background())
Update Data
// Update rows
updateOpts := &postgrest.UpdateOptions{Count: "exact"}
response, err := client.
From("users").
Update(map[string]interface{}{
"status": "inactive",
}, updateOpts).
Eq("id", 1).
Execute(context.Background())
Delete Data
// Delete rows
deleteOpts := &postgrest.DeleteOptions{Count: "exact"}
response, err := client.
From("users").
Delete(deleteOpts).
Eq("status", "inactive").
Execute(context.Background())
Upsert Data
// Upsert (insert or update)
upsertOpts := &postgrest.UpsertOptions{
OnConflict: "email",
IgnoreDuplicates: false,
Count: "exact",
}
response, err := client.
From("users").
Upsert(map[string]interface{}{
"email": "[email protected]",
"name": "John Doe",
}, upsertOpts).
Execute(context.Background())
RPC (Remote Procedure Call)
// Call a PostgreSQL function
rpcOpts := &postgrest.RpcOptions{Count: "exact"}
response, err := client.
Rpc("get_user_by_email", map[string]interface{}{
"email": "[email protected]",
}, rpcOpts).
Execute(context.Background())
Advanced Filtering
// Multiple filters
response, err := client.
From("users").
Select("*", nil).
Eq("status", "active").
Gte("age", 18).
Lte("age", 65).
In("role", []interface{}{"admin", "user"}).
Like("name", "%John%").
Execute(context.Background())
// Text search
textSearchOpts := &postgrest.TextSearchOptions{
Type: "websearch",
Config: "english",
}
response, err := client.
From("posts").
Select("*", nil).
TextSearch("content", "golang tutorial", textSearchOpts).
Execute(context.Background())
Single Result
// Get a single row
response, err := client.
From("users").
Select("*", nil).
Eq("id", 1).
Limit(1, nil).
Single().
Execute(context.Background())
// Get a single row or null (maybeSingle)
response, err := client.
From("users").
Select("*", nil).
Eq("id", 999).
MaybeSingle().
Execute(context.Background())
ExecuteTo (Unmarshal directly)
// Unmarshal directly into a struct
type User struct {
ID int64 `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
var users []User
count, err := client.
From("users").
Select("*", nil).
Eq("status", "active").
ExecuteTo(context.Background(), &users)
Schema Selection
// Switch to a different schema
client = client.Schema("private")
response, err := client.From("sensitive_data").Select("*", nil).Execute(context.Background())
Error Handling
response, err := client.From("users").Select("*", nil).Execute(context.Background())
if err != nil {
// Network or parsing error
panic(err)
}
if response.Error != nil {
// PostgREST error
fmt.Printf("Error: %s (Code: %s)\n", response.Error.Message, response.Error.Code)
fmt.Printf("Details: %s\n", response.Error.Details)
fmt.Printf("Hint: %s\n", response.Error.Hint)
}
Throw on Error
// Throw errors instead of returning them in response
response, err := client.
From("users").
Select("*", nil).
ThrowOnError().
Execute(context.Background())
// If there's an error, it will be thrown here
API Reference
Client Methods
NewClient(url, schema, headers)- Create a new clientFrom(table)- Start a query on a tableRpc(function, args, opts)- Call a PostgreSQL functionSchema(schema)- Switch to a different schemaSetApiKey(key)- Set API key headerSetAuthToken(token)- Set authorization tokenChangeSchema(schema)- Change schema for subsequent requests
QueryBuilder Methods
Select(columns, opts)- Select columnsInsert(values, opts)- Insert rowsUpdate(values, opts)- Update rowsUpsert(values, opts)- Upsert rowsDelete(opts)- Delete rows
FilterBuilder Methods
Eq(column, value)- EqualNeq(column, value)- Not equalGt(column, value)- Greater thanGte(column, value)- Greater than or equalLt(column, value)- Less thanLte(column, value)- Less than or equalLike(column, pattern)- Case-sensitive pattern matchIlike(column, pattern)- Case-insensitive pattern matchIs(column, value)- IS operator (for NULL checks)In(column, values)- IN operatorContains(column, value)- Contains (for arrays/jsonb)ContainedBy(column, value)- Contained byTextSearch(column, query, opts)- Full-text searchMatch(query)- Match multiple columnsNot(column, operator, value)- Negate operatorOr(filters, opts)- OR condition
TransformBuilder Methods
Order(column, opts)- Order resultsLimit(count, opts)- Limit resultsRange(from, to, opts)- Range resultsSingle()- Get single resultMaybeSingle()- Get single result or nullSelect(columns)- Select after insert/update/deleteCSV()- Return CSV formatGeoJSON()- Return GeoJSON formatExplain(opts)- Get query planRollback()- Rollback transactionMaxAffected(value)- Set max affected rows
Response Structure
type PostgrestResponse[T any] struct {
Error *PostgrestError `json:"error,omitempty"`
Data T `json:"data,omitempty"`
Count *int64 `json:"count,omitempty"`
Status int `json:"status"`
StatusText string `json:"statusText"`
}
Testing
Unit Tests
Some tests are implemented to run against mocked Postgrest endpoints using httpmock. To run unit tests:
go test ./...
Integration Tests
Integration tests use testcontainers-go to spin up real PostgreSQL and PostgREST containers for testing. This ensures tests run against actual PostgREST instances.
Running Integration Tests
Option 1: Using Testcontainers (Default)
Integration tests will automatically use testcontainers to start PostgreSQL and PostgREST containers:
go test -v -run TestIntegration
Option 2: Using Existing Services
If you have a running PostgREST instance, you can use it instead:
export POSTGREST_URL=http://localhost:3000
export USE_TESTCONTAINERS=false
go test -v -run TestIntegration
Option 3: Using Docker Compose
You can also use the provided docker-compose.yaml to start services manually:
docker-compose up -d
export POSTGREST_URL=http://localhost:3000
export USE_TESTCONTAINERS=false
go test -v -run TestIntegration
docker-compose down
Integration Test Coverage
The integration tests cover:
- ✅ Basic SELECT queries
- ✅ Filtering (Eq, In, Like, etc.)
- ✅ Ordering and limiting
- ✅ Single and MaybeSingle results
- ✅ INSERT operations
- ✅ UPDATE operations
- ✅ DELETE operations
- ✅ RPC (Remote Procedure Calls)
- ✅ Schema switching
- ✅ Complex queries with multiple filters
- ✅ Error handling
- ✅ Relationships and joins
Test Database Schema
The integration tests use the schema defined in test/00-schema.sql and seed data from test/01-dummy-data.sql. These files define:
userstable with various data typeschannelsandmessagestables for relationship testingkitchen_sinktable for comprehensive type testingmovie,person,profiletables for foreign key testing- PostgreSQL functions for RPC testing
- Multiple schemas (
publicandpersonal) for schema switching tests
Package made possible through the efforts of:
Made with contrib.rocks.
License
This repo is licensed under the Apache License.
Sponsors
We are building the features of Firebase using enterprise-grade, open source products. We support existing communities wherever possible, and if the products don't exist we build them and open source them ourselves. Thanks to these sponsors who are making the OSS ecosystem better for everyone.
관련 프로젝트 살펴보기
Asabeneh/30-Days-Of-Python
30 Days of Python 프로그래밍 챌린지는 Python 프로그래밍 언어를 30일 동안 배우기 위한 단계별 가이드입니다. 이 챌린지는 100일 이상 걸릴 수 있습니다. 자신의 속도에 맞춰 진행하세요. 다음 동영상도 도움이 될 수 있습니다: https://www.youtube.com/channel/UC7PNRuno1rzYPb1xLa4yktw
78,715 스타grafana/grafana
개방적이고 조합 가능한 옵저버빌리티 및 데이터 시각화 플랫폼입니다. Prometheus, Loki, Elasticsearch, InfluxDB, Postgres 등 여러 소스의 메트릭, 로그, 트레이스를 시각화합니다.
77,894 스타redis/redis
실시간 데이터 기반 애플리케이션을 구축하는 개발자에게 Redis는 가장 선호되고, 가장 빠르며, 기능이 가장 풍부한 캐시, 데이터 구조 서버이자 문서 및 벡터 쿼리 엔진입니다.
77,491 스타apache/superset
Apache Superset는 데이터 시각화 및 데이터 탐색 플랫폼입니다.
75,522 스타