NpgsqlRest 2.9.0
See the version list below for details.
dotnet add package NpgsqlRest --version 2.9.0
NuGet\Install-Package NpgsqlRest -Version 2.9.0
<PackageReference Include="NpgsqlRest" Version="2.9.0" />
paket add NpgsqlRest --version 2.9.0
#r "nuget: NpgsqlRest, 2.9.0"
// Install NpgsqlRest as a Cake Addin #addin nuget:?package=NpgsqlRest&version=2.9.0 // Install NpgsqlRest as a Cake Tool #tool nuget:?package=NpgsqlRest&version=2.9.0
NpgsqlRest
Automatic REST API for PostgreSQL Databases implemented as AOT-Ready .NET8 Middleware
If you have a PostgreSQL database - based on your configuration, NpgsqlRest can create blazing fast REST API automatically and write client code for your project.
Read the NpgsqlRest Version 2 Blog Post.
See the changelog for the latest release changes in the Changelog.
There is also a client application (AOT Build) available for download from the Release page or as an NPM package. See the client application page or the NPM Package.
High Performance
Number of Requests in 60 seconds stress test:
Platform | Number Of Requests in 60 Seconds | Ratio For 1 Request How Many NpgsqlRest AOT Requests |
---|---|---|
NpgsqlRest AOT | 781,803 | 1 |
NpgsqlRest JIT | 562,304 | 1.39 |
.NET8 ADO | 440,896 | 1.77 |
.NET8 EF | 337,612 | 2.32 |
PostgREST | 72,305 | 10.81 |
Django | 21,193 | 36.89 |
Express | 160,241 | 4.88 |
GO | 78,530 | 9.96 |
FastAPI | 13,650 | 57.27 |
Modular Design
<p style="text-align: center; width: 100%"> <img src="/npgsqlrest-v2.png" style="width: 70%;"/> </p>
Quick Example
1) Your PostgreSQL Function
create function hello_world()
returns text
language sql
as $$
select 'Hello World'
$$;
2) .NET8 AOT-Ready Web App
var builder = WebApplication.CreateSlimBuilder(args);
var app = builder.Build();
var connectionStr = "Host=localhost;Port=5432;Database=my_db;Username=postgres;Password=postgres";
app.UseNpgsqlRest(new(connectionStr));
app.Run();
3) Auto-Generated HTTP File
@host=http://localhost:5000
// function public.hello_world()
// returns text
POST {{host}}/api/hello-world/
4) Auto-Generated Typescript Client Module
const _baseUrl = "http://localhost:5000";
/**
* function public.get_latest_customer()
* returns customers
*
* @remarks
* GET /api/get-latest-customer
*
* @see FUNCTION public.get_latest_customer
*/
export async function getHelloWorld() : Promise<string> {
const response = await fetch(_baseUrl + "/api/hello-world", {
method: "GET",
headers: { "Content-Type": "application/json" },
});
return await response.text() as string;
}
5) Endpoint Response
HTTP/1.1 200 OK
Connection: close
Content-Type: text/plain
Date: Tue, 09 Jan 2024 14:25:26 GMT
Server: Kestrel
Transfer-Encoding: chunked
Hello World
Features
- Automatic generation of the HTTP REST endpoints from PostgreSQL functions and procedures.
- Native AOT-Ready. AOT is ahead-of-time compiled to the native code. No dependencies, native executable, it just runs and it's very fast.
- Customization of endpoints with comment annotations. You can easily configure any endpoint by adding comment annotation labels to PostgreSQL Comments.
- Interact seamlessly with .NET8 backend and take advantage of .NET8 features.
- High performance with or without native AOT, up to 6 times higher throughput than similar solutions.
- Plug-in system with additional functionalities: table CRUD support, code generation for HTTP Files and Typescript client and more.
Automatic Generation of REST Endpoints
See the introductory example above. Automatically build HTTP REST endpoints from PostgreSQL functions and procedures and configure them the way you like.
Native AOT-Ready
With the NET8 you can build into native code code (ahead-of-time (AOT) compilation).
NpgsqlRest is fully native AOT-ready and AOT-tested.
AOT builds have faster startup time, smaller memory footprints and don't require any .NET runtime installed.
Comment Annotations
Configure individual endpoints with powerful and simple routine comment annotations. You can use any PostgreSQL administration tool or a simple script:
Function:
create function hello_world_html()
language sql
as
$$
select '<div>Hello World</div>';
$$
comment on function hello_world_html() is '
HTTP GET /hello
Content-Type: text/html';
Will have content type text/html
as visible in comment annotation:
Connection: close
Content-Type: text/html
Date: Thu, 18 Jan 2024 11:00:39 GMT
Server: Kestrel
Transfer-Encoding: chunked
<div>Hello World</div>
NET8 backend
NpgsqlRest is implemented as a NET8 middleware component, which means that anything that is available in NET8 is also available to the NpgsqlRest REST endpoints.
And that is, well, everything... from rate limiters to all kinds of authorization schemas, to name a few.
You can also interact with the NET8 calling code to:
- Provide custom parameter validations.
- Pass custom values to function/procedure parameters.
For example, pass a Context.User.Identity.Name
to every parameter named user
:
var app = builder.Build();
app.UseNpgsqlRest(new(connectionString)
{
ValidateParameters = p =>
{
if (p.Context.User.Identity?.IsAuthenticated == true &&
string.Equals(p.ParamName, "user", StringComparison.OrdinalIgnoreCase))
{
p.Parameter.Value = p.Context.User.Identity.Name;
}
}
});
app.Run();
High Performances
Tests are executed with the K6 stress tool for:
- Duration of 60 seconds.
- 100 simultaneous virtual users.
- Retrieval of 10 and 100 records.
Platform | 10 Records | 100 Records |
---|---|---|
AOT is an ahead-of-time native compilation of NpgsqlRest . NpgsqlRest compiled to the native binary. |
781,803 | 307,427 |
JIT is a just-in-time compilation of NpgsqlRest to NET8 CLR (Common Language Runtime) on NET8 runtime. |
562,304 | 303,692 |
ADO is NET8 Raw ADO Data Reader approach. Source | 440,896 | 314,198 |
EF is Entity Framework Core 8 on NET8 runtime. Source | 337,612 | 235,331 |
PostgREST version 12.0.2 | 72,305 | 40,456 |
Django REST Framework 4.2.10 on Python 3.8 Source Link | 21,193 | 18,345 |
Express on NodeJS v20.11.1, express v4.18.3, pg 8.11.3 Source Link | 160,241 | 55,119 |
GO version go1.13.8 Source Link | 78,530 | 55,119 |
FastAPI version 0.110.0 on Python 3.8 Source Link | 13,650 | 9,666 |
See more details here.
Plug-in System
NpgsqlRest has a plug-in system that allows you to extend the functionality of the generated REST API from your PostgreSQL database.
Currently, the following plug-ins are available:
- CRUD support. Automatically generate CRUD endpoints for your PostgreSQL tables and views.
- HTTP File support. Automatically generate HTTP files for testing, with the list of available endpoints.
- Typescript Client support. Automatically generate Typescript client code from the NpgsqlRest endpoints for your Typescript projects.
Getting Started
Using Library
Library Installation
Install the package from NuGet by using any of the available methods:
dotnet add package NpgsqlRest --version 2.0.0
NuGet\Install-Package NpgsqlRest -version 2.0.0
<PackageReference Include="NpgsqlRest" Version="2.0.0" />
Library First Use
Your application builder code:
var app = builder.Build();
app.UseNpgsqlRest(new("Host=localhost;Port=5432;Database=my_db;Username=postgres;Password=postgres"));
app.Run();
For all available build options, see the options documentation.
Library Dependencies
- net8.0
- Microsoft.NET.Sdk.Web 8.0
- Npgsql 8.0.1
- PostgreSQL >= 13
Note: PostgreSQL 13 minimal version is required to run the initial query to get the list of functions. The source code of this query can be found here. For versions prior to version 13, this query can be replaced with a custom query that can run on older versions.
Contributing
Contributions from the community are welcomed. Please make a pull request with a description if you wish to contribute.
License
This project is licensed under the terms of the MIT license.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net8.0
- Npgsql (>= 8.0.3)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on NpgsqlRest:
Package | Downloads |
---|---|
NpgsqlRest.TsClient
Automatic Typescript Client Code Generation for NpgsqlRest |
|
NpgsqlRest.CrudSource
CRUD Source for NpgsqlRest |
|
NpgsqlRest.HttpFiles
Automatic HTTP Files Generation for NpgsqlRest |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.12.1 | 36 | 11/6/2024 |
2.12.0 | 69 | 10/30/2024 |
2.11.0 | 121 | 9/3/2024 |
2.10.0 | 124 | 8/23/2024 |
2.9.0 | 59 | 8/2/2024 |
2.8.5 | 109 | 6/25/2024 |
2.8.4 | 103 | 6/22/2024 |
2.8.3 | 105 | 6/11/2024 |
2.8.2 | 107 | 6/9/2024 |
2.8.1 | 85 | 5/10/2024 |
2.8.0 | 89 | 5/2/2024 |
2.7.1 | 108 | 4/30/2024 |
2.7.0 | 124 | 4/17/2024 |
2.6.1 | 116 | 4/16/2024 |
2.6.0 | 113 | 4/16/2024 |
2.5.0 | 119 | 4/15/2024 |
2.4.2 | 133 | 4/14/2024 |
2.4.1 | 111 | 4/12/2024 |
2.4.0 | 180 | 4/8/2024 |
2.3.1 | 109 | 4/5/2024 |
2.3.0 | 142 | 4/4/2024 |
2.2.0 | 100 | 4/2/2024 |
2.1.0 | 120 | 3/29/2024 |
2.0.0 | 137 | 3/26/2024 |
1.6.3 | 113 | 2/19/2024 |
1.6.2 | 125 | 2/3/2024 |
1.6.1 | 112 | 2/2/2024 |
1.6.0 | 106 | 1/28/2024 |
1.5.1 | 96 | 1/27/2024 |
1.5.0 | 106 | 1/27/2024 |
1.4.0 | 103 | 1/26/2024 |
1.3.0 | 112 | 1/23/2024 |
1.2.0 | 116 | 1/22/2024 |
1.1.0 | 118 | 1/19/2024 |
1.0.0 | 119 | 1/18/2024 |
0.0.9 | 99 | 1/18/2024 |