From d15e338057ebc44fdac499d3350579dfc9888a6f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 18:18:23 -0500 Subject: [PATCH 01/20] release page for v11.2.0 Closes #644 --- docs/releases/v11.2.0.rst | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docs/releases/v11.2.0.rst diff --git a/docs/releases/v11.2.0.rst b/docs/releases/v11.2.0.rst new file mode 100644 index 000000000..48809ae62 --- /dev/null +++ b/docs/releases/v11.2.0.rst @@ -0,0 +1,4 @@ +11.2.0 +====== + +Starting from this version, the release notes will be posted on PostgREST's GitHub release page. Please see https://github.com/PostgREST/postgrest/releases/tag/v11.2.0. From 9f26f5b16c83324592dc3e82dddfca0fb57fedaa Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 18:36:38 -0500 Subject: [PATCH 02/20] add link to github discussions closes #401 --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 4020d6195..d803c4a34 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -90,7 +90,7 @@ PostgREST has a focused scope. It works well with other tools like Nginx. This f Getting Support ---------------- -The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. +The project has a friendly and growing community. For discussions, use the Github `discussions page `_ or join our `chat room `_. You can also report or search for bugs/features on the Github `issues `_ page. .. toctree:: :glob: From 26edf1e1424e35ec979df35e6547b50dae16ea79 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 19:09:47 -0500 Subject: [PATCH 03/20] link connection string from connection pool Closes #647 --- docs/references/connection_pool.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index db7ed0160..0876dbd27 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -7,6 +7,11 @@ A connection pool is a cache of reusable database connections. It allows serving Minimizing connections is paramount to performance. Each PostgreSQL connection creates a process, having too many can exhaust available resources. +Connection String +----------------- + +For connecting to the database, the pool requires a connection string. You can can configure it using :ref:`db-uri`. + .. _pool_growth_limit: .. _dyn_conn_pool: From 3461b58f15c9da3bd8ab81b901746d1bd496b9cf Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 19:38:21 -0500 Subject: [PATCH 04/20] add different ways to specify the connection string Closes #576 --- docs/references/configuration.rst | 34 ++++++++++++++++++++++++++----- postgrest.dict | 1 + 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 338e0aa1b..e0c4864ef 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -480,18 +480,42 @@ db-uri **In-Database** `n/a` =============== ================================= - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. + The standard `PostgreSQL connection string `_, there are different ways to specify it: - If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. +URI Format +~~~~~~~~~~ - Any parameter that is not set in the connection string is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. + .. code:: - The user with whom PostgREST connects to the database is also known as the ``authenticator`` role. For more information see :ref:`roles`. + "postgres://authenticator:mysecretpassword@localhost:5433/postgres?parameters=val" - When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. + - Under this format symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. + - If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + - The user with whom PostgREST connects to the database is also known as the ``authenticator`` role. For more information see :ref:`roles`. + - When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. + +Keyword/Value Format +~~~~~~~~~~~~~~~~~~~~ + + .. code:: + + "host=localhost port=5433 user=authenticator password=mysecretpassword dbname=postgres" + +LIBPQ Environment Variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + .. code:: + + PGHOST=localhost PGPORT=5433 PGUSER=authenticator PGDATABASE=postgres + + Any parameter that is not set in the above formats is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. + +External config file +~~~~~~~~~~~~~~~~~~~~ Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the connection string out of an external file. + .. _db-use-legacy-gucs: db-use-legacy-gucs diff --git a/postgrest.dict b/postgrest.dict index cc6bc534f..3d968a3fe 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -78,6 +78,7 @@ localhost login lookups Logins +LIBPQ logins lon lt From 78a0fb68657c6ce2063435029b3fefbf0a95b8d7 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 21:15:26 -0500 Subject: [PATCH 05/20] clear supported pg versions closes #592 --- docs/explanations/install.rst | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/explanations/install.rst b/docs/explanations/install.rst index 6944803a8..df76e8aa5 100644 --- a/docs/explanations/install.rst +++ b/docs/explanations/install.rst @@ -55,6 +55,18 @@ You can also use your OS package manager. choco install postgrest scoop install postgrest + +.. _pg-dependency: + +Supported PostgreSQL versions +============================= + +=============== ================================= +**Supported** PostgreSQL >= 9.6 +=============== ================================= + +PostgREST works with all PostgreSQL versions starting from 9.6. + Running PostgREST ================= @@ -101,13 +113,6 @@ For a complete reference of the configuration file, see :ref:`configuration`. To test that the system path is set correctly, run ``pg_config`` from the command line. You should see it output a list of paths. -.. _pg-dependency: - -PostgreSQL dependency ---------------------- - -To use PostgREST you will need an underlying database. We require PostgreSQL 9.6 or greater. You can use something like `Amazon RDS `_ but installing your own locally is cheaper and more convenient for development. You can also run PostgreSQL in a :ref:`docker container`. - Docker ====== From a9426d7d0f2dff8caacbd29a72859d169c8f1a72 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 21:23:18 -0500 Subject: [PATCH 06/20] move heroku outside Installation --- docs/explanations/install.rst | 123 ---------------------------------- docs/integrations/heroku.rst | 122 +++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 123 deletions(-) create mode 100644 docs/integrations/heroku.rst diff --git a/docs/explanations/install.rst b/docs/explanations/install.rst index df76e8aa5..fad838b60 100644 --- a/docs/explanations/install.rst +++ b/docs/explanations/install.rst @@ -261,126 +261,3 @@ You can build PostgREST from source with `Stack `_: - - .. code-block:: bash - - # If you have multiple Heroku accounts, use flag '--interactive' to switch between them - heroku login --interactive - - -2. Create a new Heroku app using the PostgREST buildpack: - - .. code-block:: bash - - mkdir ${YOUR_APP_NAME} - cd ${YOUR_APP_NAME} - git init . - - heroku apps:create ${YOUR_APP_NAME} --buildpack https://github.com/PostgREST/postgrest-heroku.git - heroku git:remote -a ${YOUR_APP_NAME} - -3. Create a new Heroku PostgreSQL add-on attached to the app and keep notes of the assigned add-on name (e.g. :code:`postgresql-curly-58902`) referred later as ${HEROKU_PG_DB_NAME} - - .. code-block:: bash - - heroku addons:create heroku-postgresql:standard-0 -a ${YOUR_APP_NAME} - # wait until the add-on is available - heroku pg:wait -a ${YOUR_APP_NAME} - -4. Create the necessary user roles according to the - `PostgREST documentation `_: - - .. code-block:: bash - - heroku pg:credentials:create --name api_user -a ${YOUR_APP_NAME} - # use the following command to ensure the new credential state is active before attaching it - heroku pg:credentials -a ${YOUR_APP_NAME} - - heroku addons:attach ${HEROKU_PG_DB_NAME} --credential api_user -a ${YOUR_APP_NAME} - -5. Connect to the PostgreSQL database and create some sample data: - - .. code-block:: bash - - heroku psql -a ${YOUR_APP_NAME} - - .. code-block:: postgres - - # from the psql command prompt execute the following commands: - create schema api; - - create table api.todos ( - id serial primary key, - done boolean not null default false, - task text not null, - due timestamptz - ); - - insert into api.todos (task) values - ('finish tutorial 0'), ('pat self on back'); - - grant usage on schema api to api_user; - grant select on api.todos to api_user; - -6. Create the :code:`Procfile`: - - .. code-block:: bash - - web: PGRST_SERVER_HOST=0.0.0.0 PGRST_SERVER_PORT=${PORT} PGRST_DB_URI=${PGRST_DB_URI:-${DATABASE_URL}} ./postgrest-${POSTGREST_VER} - .. - - Set the following environment variables on Heroku: - - .. code-block:: bash - - heroku config:set POSTGREST_VER=10.0.0 - heroku config:set PGRST_DB_SCHEMA=api - heroku config:set PGRST_DB_ANON_ROLE=api_user - .. - - PGRST_DB_URI can be set if an external database is used or if it's different from the default Heroku DATABASE_URL. This latter is used if nothing is provided. - POSTGREST_VER is mandatory to select and build the required PostgREST release. - - See https://postgrest.org/en/stable/configuration.html#environment-variables for the full list of environment variables. - -7. Build and deploy your app: - - .. code-block:: bash - - git add Procfile - git commit -m "PostgREST on Heroku" - git push heroku master - .. - - Your Heroku app should be live at :code:`${YOUR_APP_NAME}.herokuapp.com` - -8. Test your app - - From a terminal display the application logs: - - .. code-block:: bash - - heroku logs -t - .. - - From a different terminal retrieve with curl the records previously created: - - .. code-block:: bash - - curl https://${YOUR_APP_NAME}.herokuapp.com/todos - .. - - and test that any attempt to modify the table via a read-only user is not allowed: - - .. code-block:: bash - - curl https://${YOUR_APP_NAME}.herokuapp.com/todos -X POST \ - -H "Content-Type: application/json" \ - -d '{"task": "do bad thing"}' diff --git a/docs/integrations/heroku.rst b/docs/integrations/heroku.rst new file mode 100644 index 000000000..614950c1d --- /dev/null +++ b/docs/integrations/heroku.rst @@ -0,0 +1,122 @@ +.. _deploy_heroku: + +Heroku +====== + +1. Log into Heroku using the `Heroku CLI `_: + + .. code-block:: bash + + # If you have multiple Heroku accounts, use flag '--interactive' to switch between them + heroku login --interactive + + +2. Create a new Heroku app using the PostgREST buildpack: + + .. code-block:: bash + + mkdir ${YOUR_APP_NAME} + cd ${YOUR_APP_NAME} + git init . + + heroku apps:create ${YOUR_APP_NAME} --buildpack https://github.com/PostgREST/postgrest-heroku.git + heroku git:remote -a ${YOUR_APP_NAME} + +3. Create a new Heroku PostgreSQL add-on attached to the app and keep notes of the assigned add-on name (e.g. :code:`postgresql-curly-58902`) referred later as ${HEROKU_PG_DB_NAME} + + .. code-block:: bash + + heroku addons:create heroku-postgresql:standard-0 -a ${YOUR_APP_NAME} + # wait until the add-on is available + heroku pg:wait -a ${YOUR_APP_NAME} + +4. Create the necessary user roles according to the + `PostgREST documentation `_: + + .. code-block:: bash + + heroku pg:credentials:create --name api_user -a ${YOUR_APP_NAME} + # use the following command to ensure the new credential state is active before attaching it + heroku pg:credentials -a ${YOUR_APP_NAME} + + heroku addons:attach ${HEROKU_PG_DB_NAME} --credential api_user -a ${YOUR_APP_NAME} + +5. Connect to the PostgreSQL database and create some sample data: + + .. code-block:: bash + + heroku psql -a ${YOUR_APP_NAME} + + .. code-block:: postgres + + # from the psql command prompt execute the following commands: + create schema api; + + create table api.todos ( + id serial primary key, + done boolean not null default false, + task text not null, + due timestamptz + ); + + insert into api.todos (task) values + ('finish tutorial 0'), ('pat self on back'); + + grant usage on schema api to api_user; + grant select on api.todos to api_user; + +6. Create the :code:`Procfile`: + + .. code-block:: bash + + web: PGRST_SERVER_HOST=0.0.0.0 PGRST_SERVER_PORT=${PORT} PGRST_DB_URI=${PGRST_DB_URI:-${DATABASE_URL}} ./postgrest-${POSTGREST_VER} + .. + + Set the following environment variables on Heroku: + + .. code-block:: bash + + heroku config:set POSTGREST_VER=10.0.0 + heroku config:set PGRST_DB_SCHEMA=api + heroku config:set PGRST_DB_ANON_ROLE=api_user + .. + + PGRST_DB_URI can be set if an external database is used or if it's different from the default Heroku DATABASE_URL. This latter is used if nothing is provided. + POSTGREST_VER is mandatory to select and build the required PostgREST release. + + See https://postgrest.org/en/stable/configuration.html#environment-variables for the full list of environment variables. + +7. Build and deploy your app: + + .. code-block:: bash + + git add Procfile + git commit -m "PostgREST on Heroku" + git push heroku master + .. + + Your Heroku app should be live at :code:`${YOUR_APP_NAME}.herokuapp.com` + +8. Test your app + + From a terminal display the application logs: + + .. code-block:: bash + + heroku logs -t + .. + + From a different terminal retrieve with curl the records previously created: + + .. code-block:: bash + + curl https://${YOUR_APP_NAME}.herokuapp.com/todos + .. + + and test that any attempt to modify the table via a read-only user is not allowed: + + .. code-block:: bash + + curl https://${YOUR_APP_NAME}.herokuapp.com/todos -X POST \ + -H "Content-Type: application/json" \ + -d '{"task": "do bad thing"}' From 1f5d57c3fb2ddc131ac56ce9079c0c20177cc51e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 22:32:20 -0500 Subject: [PATCH 07/20] mention header names are lowercased Closes #627 --- docs/references/transactions.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index 85f462fa2..1e732cd7a 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -113,6 +113,10 @@ Request Headers, Cookies and JWT claims PostgREST stores the headers, cookies and headers as JSON. To get them: +.. important:: + + The headers names are lowercased. e.g. If the request sends ``User-Agent: x`` this will be obtainable as ``current_setting('request.headers', true)::json->>'user-agent'``. + .. code-block:: postgresql -- To get all the headers sent in the request From 1671ec00033e2fd1cd6b0aaf17df51bd26184118 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 22:43:22 -0500 Subject: [PATCH 08/20] add apache apisix tutorial --- docs/ecosystem.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index da7b4eb66..423f0341b 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -20,6 +20,8 @@ Community Tutorials * `Build data-driven applications with Workers and PostgreSQL `_ - A tutorial on how to integrate with PostgREST and PostgreSQL using Cloudflare Workers. +* `A poor man's API `_ - Shows how to integrate PostgREST with Apache APISIX as an alternative to Nginx. + .. _templates: Templates From 002d02b0907e399d5eb01748fb9ee2f1ddaae162 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 23:08:52 -0500 Subject: [PATCH 09/20] add return=minimal and organize other returns Closes #624 --- docs/references/api/tables_views.rst | 111 +++++++++++++++++++++------ 1 file changed, 89 insertions(+), 22 deletions(-) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 3d4bb9b31..469ad612f 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -693,60 +693,100 @@ HEAD A HEAD method will behave identically to GET except that no body will be returned (`RFC 2616 `_) . As an optimization, the generated query won't execute an aggregate (to avoid unnecessary data transfer). -.. _update: +.. _insert: -Update +Insert ====== -To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. +All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. + +To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. .. tabs:: .. code-tab:: http - PATCH /people?age=lt.13 HTTP/1.1 + POST /table_name HTTP/1.1 - { "category": "child" } + { "col1": "value1", "col2": "value2" } .. code-tab:: bash Curl - curl "http://localhost:3000/people?age=lt.13" \ - -X PATCH -H "Content-Type: application/json" \ - -d '{ "category": "child" }' + curl "http://localhost:3000/table_name" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "col1": "value1", "col2": "value2" }' -Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. +.. code:: -.. warning:: + HTTP/1.1 201 Created - Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. +No request body will be returned by default. -.. _insert: +.. note:: -Insert -====== + You can use the ``Prefer: return=minimal`` header to get the same behavior. This is only provided for completeness because it's basically a no-op. -All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. +Prefer: return=headers-only +--------------------------- -To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. +If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. .. tabs:: .. code-tab:: http - POST /table_name HTTP/1.1 + POST /projects HTTP/1.1 + Prefer: return=headers-only - { "col1": "value1", "col2": "value2" } + {"id":33, "name": "x"} .. code-tab:: bash Curl - curl "http://localhost:3000/table_name" \ - -X POST -H "Content-Type: application/json" \ - -d '{ "col1": "value1", "col2": "value2" }' + curl "http://localhost:3000/projects" \ + -X POST -H "Content-Type: application/json" -H "Prefer: return=headers-only" \ + -d '{"id":33, "name": "x"}' -If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. +.. code-block:: http + + HTTP/1.1 201 Created + Location: /projects?id=eq.34 + +Prefer: return=representation +----------------------------- On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. +.. tabs:: + + .. code-tab:: http + + POST /projects HTTP/1.1 + Content-Type: application/json; charset=utf-8 + Prefer: return=representation + + {"id":33, "name": "x"} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/projects" \ + -X POST -H "Content-Type: application/json" -H "Prefer: return=representation" \ + -d '{"id":33, "name": "x"}' + +.. code:: + + HTTP/1.1 201 Created + Transfer-Encoding: chunked + + [ + { + "id": 33, + "name": "x" + } + ] + +x-www-form-urlencoded +--------------------- + URL encoded payloads can be posted with ``Content-Type: application/x-www-form-urlencoded``. .. tabs:: @@ -952,6 +992,33 @@ In this case, only **source**, **publication_date** and **figure** will be inser Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and it'll send it directly to PostgreSQL. +.. _update: + +Update +====== + +To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. + +.. tabs:: + + .. code-tab:: http + + PATCH /people?age=lt.13 HTTP/1.1 + + { "category": "child" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?age=lt.13" \ + -X PATCH -H "Content-Type: application/json" \ + -d '{ "category": "child" }' + +Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. + +.. warning:: + + Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. + .. _upsert: Upsert From 053736bef8bf0cbe32e2f2a1e012311a9c20eaa6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 23:11:12 -0500 Subject: [PATCH 10/20] fix dict --- postgrest.dict | 3 +++ 1 file changed, 3 insertions(+) diff --git a/postgrest.dict b/postgrest.dict index 3d968a3fe..c5070d1dd 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -1,6 +1,7 @@ personal_ws-1.1 en 0 utf-8 api API's +APISIX Archlinux aud Auth @@ -186,6 +187,7 @@ Upsert upsert uri url +urlencoded urls variadic verifier @@ -197,4 +199,5 @@ websearch Websockets webuser wfts +www Zac From 2e0bce1cf903284b399c8a3bf580d3c74565d63e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 23:51:41 -0500 Subject: [PATCH 11/20] add dynamic schemas example Closes #644 --- docs/references/api/schemas.rst | 49 +++++++++++++++++++++++++++++++ docs/references/configuration.rst | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/references/api/schemas.rst b/docs/references/api/schemas.rst index 359f5c959..4c62de451 100644 --- a/docs/references/api/schemas.rst +++ b/docs/references/api/schemas.rst @@ -105,3 +105,52 @@ You can only switch to a schema included in :ref:`db-schemas`. Using another sch "message":"The schema must be one of the following: tenant1, tenant2" } + +Dynamic schemas +~~~~~~~~~~~~~~~ + +To add schemas dynamically, you can use :ref:`in_db_config` plus :ref:`config reloading ` and :ref:`schema cache reloading `. Here are some options for how to do this: + +- If the schemas' names have a pattern, like a ``tenant_`` prefix, do: + +.. code-block:: postgresql + + create or replace function postgrest.pre_config() + returns void as $$ + select + set_config('pgrst.db_schemas', string_agg(nspname, ','), true) + from pg_namespace + where nspname like 'tenant_%'; + $$ language sql; + +- If there's no name pattern but they're created with a particular role (``CREATE SCHEMA mine AUTHORIZATION joe``), do: + +.. code-block:: postgresql + + create or replace function postgrest.pre_config() + returns void as $$ + select + set_config('pgrst.db_schemas', string_agg(nspname, ','), true) + from pg_namespace + where nspowner = 'joe'::regrole; + $$ language sql; + +- Otherwise, you might need to create a table that stores the allowed schemas. + +.. code-block:: postgresql + + create table postgrest.config (schemas text); + + create or replace function postgrest.pre_config() + returns void as $$ + select + set_config('pgrst.db_schemas', schemas, true) + from postgrest.config; + $$ language sql; + +Then each time you add an schema, do: + +.. code-block:: postgresql + + NOTIFY pgrst, 'reload config'; + NOTIFY pgrst, 'reload schema'; diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index e0c4864ef..5da6db953 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -255,7 +255,7 @@ db-pre-config **In-Database** pgrst.db_pre_config =============== ======================= - Name of the function that does in-database configuration. + Name of the function that does :ref:`in_db_config`. .. _db-extra-search-path: From 51bde5df2a41208b762a69541827cb3deece1d8e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 6 Aug 2023 21:00:16 -0500 Subject: [PATCH 12/20] use the foreign key join term --- docs/references/api/resource_embedding.rst | 327 +++++++++++---------- 1 file changed, 174 insertions(+), 153 deletions(-) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index be4ea15f2..18c1076bf 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -5,19 +5,31 @@ Resource Embedding PostgREST allows including related resources in a single API call. This reduces the need for many API requests. -**Foreign Keys** determine which tables and views can be returned together. For example, consider a database of films and their awards: +.. _fk_join: -.. image:: ../../_static/film.png +Foreign Key Joins +================= + +The server uses **Foreign Keys** to determine which tables and views can be joined together. + +- For joining tables, it reads foreign keys (respecting composite keys) and generates a join condition based on the foreign key columns. +- For joining views, it reads the base tables of the views' definition, and generates a join condition based on the foreign key columns of the base tables. .. important:: - - PostgREST respects composite foreign keys. - Whenever foreign keys change you must do :ref:`schema_reloading` for this feature to work. +Relationships +============= + +For example, consider a database of films and their awards: + +.. image:: ../../_static/film.png + .. _many-to-one: Many-to-one relationships -========================= +------------------------- Since ``films`` has a **foreign key** to ``directors``, this establishes a many-to-one relationship. Thus, we're able to request all the films and the director for each film. @@ -83,7 +95,7 @@ Since the table name is plural, we can be more accurate by making it singular wi .. _one-to-many: One-to-many relationships -========================= +------------------------- The **foreign key reference** establishes the inverse one-to-many relationship. In this case, ``films`` returns as a JSON array because of the “to-many” end. @@ -120,7 +132,7 @@ The **foreign key reference** establishes the inverse one-to-many relationship. .. _many-to-many: Many-to-many relationships -========================== +-------------------------- The join table determines many-to-many relationships. It must contain foreign keys to other two tables and they must be part of its composite key. @@ -168,7 +180,7 @@ For the many-to-many relationship between ``films`` and ``actors``, the join tab .. _one-to-one: One-to-one relationships -======================== +------------------------ One-to-one relationships are detected in two ways. @@ -220,7 +232,7 @@ One-to-one relationships are detected in two ways. Computed Relationships ====================== -You can manually define relationships between resources using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. +You can manually define relationships between using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. @@ -325,13 +337,21 @@ Computed relationships have good performance as their intended design enable `in .. _target_disamb: .. _complex_rels: -Complex Relationships -===================== +FK Joins on Multiple Foreign Key Relationships +============================================== + +When there are multiple foreign keys between tables, :ref:`fk_join` need disambiguation to resolve which foreign key columns to use for the join. -As mentioned on :ref:`resource_embedding`, the server does joins based on **Foreign Keys**. -When there are many foreign keys between tables, it needs disambiguation to resolve which foreign key columns to use for the join. +.. code:: -:ref:`computed_relationships` can do the job here, they can choose join columns arbitrarily. + HTTP/1.1 300 Multiple Choices + + { + "code": "PGRST201", + "details": [ "..." ], + "hint": "...", + "message": "Could not embed because more than one relationship was found for 'sites' and 'big_projects'" + } .. note:: @@ -365,7 +385,7 @@ Multiple Many-To-One shipping_address_id int references addresses(id) ); -To successfully embed ``orders`` with ``addresses``, you need to create computed relationships for the foreign keys columns you want to use: +To successfully join ``orders`` with ``addresses``, you need to create computed relationships for the foreign keys columns you want to use: .. code-block:: postgresql @@ -377,7 +397,7 @@ To successfully embed ``orders`` with ``addresses``, you need to create computed select * from addresses where id = $1.shipping_address_id $$ stable language sql; -Now, we can unambiguously embed the billing and shipping addresses. +Now, we can unambiguously join the billing and shipping addresses. .. tabs:: @@ -409,7 +429,7 @@ Multiple One-To-Many -------------------- Let's take the tables from :ref:`multiple_m2o`. -To embed ``addresses`` with ``orders``, you need to create computed relationships like these ones: +To join ``addresses`` with ``orders``, you need to create computed relationships like these ones: .. code-block:: postgresql @@ -669,6 +689,144 @@ Then, the request would be: } ] +.. _embedding_partitioned_tables: + +FK Joins on Partitioned Tables +============================== + +Foreign Key joins can also be done between `partitioned tables `_ and other tables. + +For example, let's create the ``box_office`` partitioned table that has the gross daily revenue of a film: + +.. code-block:: postgres + + CREATE TABLE box_office ( + bo_date DATE NOT NULL, + film_id INT REFERENCES test.films NOT NULL, + gross_revenue DECIMAL(12,2) NOT NULL, + PRIMARY KEY (bo_date, film_id) + ) PARTITION BY RANGE (bo_date); + + -- Let's also create partitions for each month of 2021 + + CREATE TABLE box_office_2021_01 PARTITION OF test.box_office + FOR VALUES FROM ('2021-01-01') TO ('2021-01-31'); + + CREATE TABLE box_office_2021_02 PARTITION OF test.box_office + FOR VALUES FROM ('2021-02-01') TO ('2021-02-28'); + + -- and so until december 2021 + +Since it contains the ``films_id`` foreign key, it is possible to join ``box_office`` and ``films``: + +.. tabs:: + + .. code-tab:: http + + GET /box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000" + +.. note:: + + * FK joins on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`computed_relationships` can be used if this is needed. + + * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. + +.. _embedding_views: + +FK Joins on Views +================= + +PostgREST will infer the relationships of a view based on its base tables. Base tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. +The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. + +For instance, the following view has ``nominations``, ``films`` and ``competitions`` as base tables: + +.. code-block:: postgres + + CREATE VIEW nominations_view AS + SELECT + films.title as film_title + , competitions.name as competition_name + , nominations.rank + , nominations.film_id as nominations_film_id + , films.id as film_id + FROM nominations + JOIN films ON films.id = nominations.film_id + JOIN competitions ON competitions.id = nominations.competition_id; + +Since this view contains ``nominations.film_id``, which has a **foreign key** relationship to ``films``, then we can join the ``films`` table. Similarly, because the view contains ``films.id``, then we can also join the ``roles`` and the ``actors`` tables (the last one in a many-to-many relationship): + +.. tabs:: + + .. code-tab:: http + + GET /nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5" + +It's also possible to foreign key join `Materialized Views `_. + +.. important:: + + - It's not guaranteed that FK joins will work on all kinds of views. In particular, FK joins won't work on views that contain UNIONs. + + + Why? PostgREST detects base table foreign keys in the view by querying and parsing `pg_rewrite `_. + This may fail depending on the complexity of the view. + + As a workaround, you can use :ref:`computed_relationships` to define manual relationships for views. + + - If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. + +.. _embedding_view_chains: + +FK Joins on Chains of Views +--------------------------- + +Views can also depend on other views, which in turn depend on the actual base table. For PostgREST to pick up those chains recursively to any depth, all the views must be in the search path, so either in the exposed schema (:ref:`db-schemas`) or in one of the schemas set in :ref:`db-extra-search-path`. This does not apply to the base table, which could be in a private schema as well. See :ref:`schema_isolation` for more details. + +.. _s_proc_embed: + +FK Joins on Table-Valued Functions +================================== + +If you have a :ref:`Stored Procedure ` that returns a table type, you can do a Foreign Key join on the result. + +Here's a sample function (notice the ``RETURNS SETOF films``). + +.. code-block:: plpgsql + + CREATE FUNCTION getallfilms() RETURNS SETOF films AS $$ + SELECT * FROM films; + $$ LANGUAGE SQL STABLE; + +A request with ``directors`` embedded: + +.. tabs:: + + .. code-tab:: http + + GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers*" + +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon", + "directors": { + "id": 2, + "last_name": "Lumière" + } + } + ] + .. _nested_embedding: Nested Embedding @@ -981,143 +1139,6 @@ You can use this to get the columns of a join table in a many-to-many relationsh The spread operator ``...`` is borrowed from the Javascript `spread syntax `_. -.. _embedding_partitioned_tables: - -Embedding Partitioned Tables -============================ - -Embedding can also be done between `partitioned tables `_ and other tables. - -For example, let's create the ``box_office`` partitioned table that has the gross daily revenue of a film: - -.. code-block:: postgres - - CREATE TABLE box_office ( - bo_date DATE NOT NULL, - film_id INT REFERENCES test.films NOT NULL, - gross_revenue DECIMAL(12,2) NOT NULL, - PRIMARY KEY (bo_date, film_id) - ) PARTITION BY RANGE (bo_date); - - -- Let's also create partitions for each month of 2021 - - CREATE TABLE box_office_2021_01 PARTITION OF test.box_office - FOR VALUES FROM ('2021-01-01') TO ('2021-01-31'); - - CREATE TABLE box_office_2021_02 PARTITION OF test.box_office - FOR VALUES FROM ('2021-02-01') TO ('2021-02-28'); - - -- and so until december 2021 - -Since it contains the ``films_id`` foreign key, it is possible to embed ``box_office`` and ``films``: - -.. tabs:: - - .. code-tab:: http - - GET /box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000" - -.. note:: - - * Embedding on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`custom_queries` can be used if this is needed. - - * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. - -.. _embedding_views: - -Embedding Views -=============== - -PostgREST will infer the relationships of a view based on its source tables. Source tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. - -For instance, the following view has ``nominations``, ``films`` and ``competitions`` as source tables: - -.. code-block:: postgres - - CREATE VIEW nominations_view AS - SELECT - films.title as film_title - , competitions.name as competition_name - , nominations.rank - , nominations.film_id as nominations_film_id - , films.id as film_id - FROM nominations - JOIN films ON films.id = nominations.film_id - JOIN competitions ON competitions.id = nominations.competition_id; - -Since this view contains ``nominations.film_id``, which has a **foreign key** relationship to ``films``, then we can embed the ``films`` table. Similarly, because the view contains ``films.id``, then we can also embed the ``roles`` and the ``actors`` tables (the last one in a many-to-many relationship): - -.. tabs:: - - .. code-tab:: http - - GET /nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5" - -It's also possible to embed `Materialized Views `_. - -.. important:: - - - It's not guaranteed that all kinds of views will be embeddable. In particular, views that contain UNIONs will not be made embeddable. - - + Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. - This may fail depending on the complexity of the view. - + As a workaround, you can use :ref:`computed_relationships` to define manual relationships for views. - - - If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. - -.. _embedding_view_chains: - -Embedding Chains of Views -========================= - -Views can also depend on other views, which in turn depend on the actual source table. For PostgREST to pick up those chains recursively to any depth, all the views must be in the search path, so either in the exposed schema (:ref:`db-schemas`) or in one of the schemas set in :ref:`db-extra-search-path`. This does not apply to the source table, which could be in a private schema as well. See :ref:`schema_isolation` for more details. - -.. _s_proc_embed: - -Embedding on Stored Procedures -============================== - -If you have a :ref:`Stored Procedure ` that returns a table type, you can embed its related resources. - -Here's a sample function (notice the ``RETURNS SETOF films``). - -.. code-block:: plpgsql - - CREATE FUNCTION getallfilms() RETURNS SETOF films AS $$ - SELECT * FROM films; - $$ LANGUAGE SQL STABLE; - -A request with ``directors`` embedded: - -.. tabs:: - - .. code-tab:: http - - GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers*" - -.. code-block:: json - - [ - { "title": "Workers Leaving The Lumière Factory In Lyon", - "directors": { - "id": 2, - "last_name": "Lumière" - } - } - ] - .. _mutation_embed: Embedding after Insertions/Updates/Deletions From 0439364794937ff3129b6000c102f5cad327c1f6 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 7 Aug 2023 18:25:49 -0500 Subject: [PATCH 13/20] Add missing ERD/SQL tabs and fix some requests --- diagrams/README.md | 2 + diagrams/boxoffice.er | 15 ++ diagrams/employees.er | 5 + diagrams/film.er | 11 ++ diagrams/orders.er | 5 + diagrams/premieres.er | 16 ++ diagrams/presidents.er | 5 + diagrams/users.er | 5 + docs/_static/boxoffice.png | Bin 0 -> 11482 bytes docs/_static/employees.png | Bin 8244 -> 8550 bytes docs/_static/film.png | Bin 51752 -> 56781 bytes docs/_static/orders.png | Bin 17892 -> 16680 bytes docs/_static/premieres.png | Bin 0 -> 8990 bytes docs/_static/presidents.png | Bin 8331 -> 9166 bytes docs/_static/users.png | Bin 14073 -> 15354 bytes docs/references/api/resource_embedding.rst | 173 +++++++++++++-------- 16 files changed, 173 insertions(+), 64 deletions(-) create mode 100644 diagrams/boxoffice.er create mode 100644 diagrams/premieres.er create mode 100644 docs/_static/boxoffice.png create mode 100644 docs/_static/premieres.png diff --git a/diagrams/README.md b/diagrams/README.md index 67009dc31..fa4a1e7fe 100644 --- a/diagrams/README.md +++ b/diagrams/README.md @@ -8,6 +8,8 @@ You can go download erd from https://github.com/BurntSushi/erd/releases and then ./erd_static-x86-64 -i diagrams/film.er -o docs/_static/film.png ``` +The fonts used belong to the GNU FreeFont family. You can download them here: http://ftp.gnu.org/gnu/freefont/ + ## LaTeX The schema structure diagram is done with LaTeX. You can use a GUI like https://www.mathcha.io/editor to create the .tex file. diff --git a/diagrams/boxoffice.er b/diagrams/boxoffice.er new file mode 100644 index 000000000..7d6b0a1c7 --- /dev/null +++ b/diagrams/boxoffice.er @@ -0,0 +1,15 @@ +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + +[Box_Office] +*bo_date +*+film_id +gross_revenue + +[Films] +*id ++director_id +title +`...` + +Box_Office +--1 Films diff --git a/diagrams/employees.er b/diagrams/employees.er index 7010a670e..4632f5bac 100644 --- a/diagrams/employees.er +++ b/diagrams/employees.er @@ -1,3 +1,8 @@ +# Build using: -e ortho + +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + [Employees] *id first_name diff --git a/diagrams/film.er b/diagrams/film.er index d19fdf61b..cc54c4800 100644 --- a/diagrams/film.er +++ b/diagrams/film.er @@ -1,3 +1,6 @@ +entity {font: "FreeSans"} +relationship {font: "FreeSerif"} + [Films] *id +director_id @@ -31,6 +34,12 @@ year *+film_id rank +[Technical_Specs] +*+film_id +runtime +camera +sound + Roles *--1 Actors Roles *--1 Films @@ -38,3 +47,5 @@ Nominations *--1 Competitions Nominations *--1 Films Films *--1 Directors + +Films 1--1 Technical_Specs diff --git a/diagrams/orders.er b/diagrams/orders.er index bdd93de2e..86f0805e9 100644 --- a/diagrams/orders.er +++ b/diagrams/orders.er @@ -1,3 +1,8 @@ +# Build using: -e ortho + +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + [Addresses] *id name diff --git a/diagrams/premieres.er b/diagrams/premieres.er new file mode 100644 index 000000000..6099e74fd --- /dev/null +++ b/diagrams/premieres.er @@ -0,0 +1,16 @@ +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + +[Premieres] +*id +location +date ++film_id + +[Films] +*id ++director_id +title +`...` + +Premieres *--1 Films diff --git a/diagrams/presidents.er b/diagrams/presidents.er index b49100961..ca7cf71ba 100644 --- a/diagrams/presidents.er +++ b/diagrams/presidents.er @@ -1,3 +1,8 @@ +# Build using: -e ortho + +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + [Presidents] *id first_name diff --git a/diagrams/users.er b/diagrams/users.er index e42ca312f..8ec011302 100644 --- a/diagrams/users.er +++ b/diagrams/users.er @@ -1,3 +1,8 @@ +# Build using: -e ortho + +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + [Users] *id first_name diff --git a/docs/_static/boxoffice.png b/docs/_static/boxoffice.png new file mode 100644 index 0000000000000000000000000000000000000000..87249a6659f7c1f1a050f800fec72e16a52a441a GIT binary patch literal 11482 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 ODBij&mn&oX{67G^$XU1m literal 0 HcmV?d00001 diff --git a/docs/_static/employees.png b/docs/_static/employees.png index 0a72df2a28ccb7c5042db28cdbbc6a0a158874a1..b21153cc5af6c662788cceeef1871d096f57bd3d 100644 GIT binary patch literal 8550 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 diff --git a/docs/_static/film.png b/docs/_static/film.png index 99843b8709145b1f89bf14ea93b2134a9f2b4a2f..03b9b2b749d9d7cc2a3d1a98995ef8bd86796b79 100644 GIT binary patch literal 56781 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 literal 51752 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 HDWM4f7(Sx2 diff --git a/docs/_static/orders.png b/docs/_static/orders.png index db709c873da885c3c73b42678bbcc279f582c836..0ac19aacd2c7ddfe9cbf1ae6d670fc8725b76206 100644 GIT binary patch literal 16680 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 M>FVdQ&MBb@0J;5iXaE2J diff --git a/docs/_static/premieres.png b/docs/_static/premieres.png new file mode 100644 index 0000000000000000000000000000000000000000..794e96767de072d6414630fc9fbfbeb24d4f9d9b GIT binary patch literal 8990 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 A(EtDd literal 8331 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 bIxeu3dLq^aE+Yis^$3-_nhKS2mSO)3irzAo diff --git a/docs/_static/users.png b/docs/_static/users.png index f8b57fee753d46a31e6d918c868c8775fc8f97fb..d94f097fc01a41246fdc32b747369519bfe600e4 100644 GIT binary patch literal 15354 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 Y=eAoHZk`NIaNh`7NkxfbF$2H<1p%6R&;S4c diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 18c1076bf..63dda347e 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -24,7 +24,56 @@ Relationships For example, consider a database of films and their awards: -.. image:: ../../_static/film.png +.. _erd_film: + +.. tabs:: + + .. group-tab:: ERD + + .. image:: ../../_static/film.png + + .. code-tab:: postgresql SQL + + create table actors( + id int primary key generated always as identity, + first_name text, + last_name text + ); + + create table directors( + id int primary key generated always as identity, + first_name text, + last_name text + ); + + create table films( + id int primary key generated always as identity, + director_id int references directors(id), + title text, + year int, + rating numeric(3,1), + language text + ); + + create table roles( + film_id int references films(id), + actor_id int references actors(id), + character text, + primary key(film_id, actor_id) + ); + + create table competitions( + id int primary key generated always as identity, + name text, + year int + ); + + create table nominations( + competition_id int references competitions(id), + film_id int references films(id), + rank int, + primary key (competition_id, film_id) + ); .. _many-to-one: @@ -136,24 +185,7 @@ Many-to-many relationships The join table determines many-to-many relationships. It must contain foreign keys to other two tables and they must be part of its composite key. -For the many-to-many relationship between ``films`` and ``actors``, the join table ``roles`` is: - -.. code-block:: postgresql - - create table roles( - film_id int references films(id) - , actor_id int references actors(id) - , primary key(film_id, actor_id) - ); - - -- the join table can also be detected if the composite key has additional columns - - create table roles( - id int generated always as identity, - , film_id int references films(id) - , actor_id int references actors(id) - , primary key(id, film_id, actor_id) - ); +Thus, it can detect the join table ``roles`` between ``films`` and ``actors``: .. tabs:: @@ -177,6 +209,18 @@ For the many-to-many relationship between ``films`` and ``actors``, the join tab ".." ] +The join table can also be detected if the composite key has additional columns: + +.. code-block:: postgresql + + create table roles( + id int generated always as identity, + , film_id int references films(id) + , actor_id int references actors(id) + , character text, + , primary key(id, film_id, actor_id) + ); + .. _one-to-one: One-to-one relationships @@ -184,38 +228,27 @@ One-to-one relationships One-to-one relationships are detected in two ways. +- When the foreign key is a primary key as specified in the :ref:`DB structure example `. - When the foreign key has a unique constraint. -.. code-block:: postgresql - - CREATE TABLE technical_specs( - film_id INT REFERENCES films UNIQUE, - runtime TIME, - camera TEXT, - sound TEXT - ); - -- When the foreign key is a primary key. - -.. code-block:: postgresql + .. code-block:: postgresql - -- references Films using the primary key as a foreign key - CREATE TABLE technical_specs( - film_id INT PRIMARY KEY REFERENCES films, - runtime TIME, - camera TEXT, - sound TEXT - ); + CREATE TABLE technical_specs( + film_id INT REFERENCES films UNIQUE, + runtime TIME, + camera TEXT, + sound TEXT + ); .. tabs:: .. code-tab:: http - GET /films?select=title,technical_specs(runtime) HTTP/1.1 + GET /films?select=title,technical_specs(camera) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/films?select=title,technical_specs(runtime)" + curl "http://localhost:3000/films?select=title,technical_specs(camera)" .. code-block:: json @@ -236,20 +269,26 @@ You can manually define relationships between using functions. This is useful fo Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. -.. code-block:: postgres +.. tabs:: - create foreign table premieres ( - id integer, - location text, - "date" date, - film_id integer - ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); + .. group-tab:: ERD - create function film(premieres) returns setof films rows 1 as $$ - select * from films where id = $1.film_id - $$ stable language sql; + .. image:: ../../_static/premieres.png + + .. code-tab:: postgresql SQL -The above function defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. + create foreign table premieres ( + id integer, + location text, + "date" date, + film_id integer + ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); + + create function film(premieres) returns setof films rows 1 as $$ + select * from films where id = $1.film_id + $$ stable language sql; + +The above function (see the **SQL** tab) defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. The name of the function ``film`` is arbitrary and can be used to do the embedding: .. tabs:: @@ -698,24 +737,30 @@ Foreign Key joins can also be done between `partitioned tables Date: Mon, 7 Aug 2023 22:04:17 -0500 Subject: [PATCH 14/20] Revert disamb using FK instead of computed rels --- docs/references/api/resource_embedding.rst | 75 +++++++--------------- 1 file changed, 24 insertions(+), 51 deletions(-) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 63dda347e..3870f298a 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -372,7 +372,6 @@ Computed relationships have good performance as their intended design enable `in - Make sure to correctly label the ``to-one`` part of the relationship. When using the ``ROWS 1`` estimation, PostgREST will expect a single row to be returned. If that is not the case, it will unnest the embedding and return repeated values for the top level resource. .. _embed_disamb: -.. _hint_disamb: .. _target_disamb: .. _complex_rels: @@ -392,14 +391,8 @@ When there are multiple foreign keys between tables, :ref:`fk_join` need disambi "message": "Could not embed because more than one relationship was found for 'sites' and 'big_projects'" } -.. note:: - - Previous versions addressed complex relationships with `Embedding disambiguation `_ but this is now deprecated. Follow the solutions in this section when a ``300 Multiple Choices`` error is returned. - -.. _multiple_m2o: - -Multiple Many-To-One --------------------- +Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. +For example, let's use the following tables: .. tabs:: @@ -420,23 +413,15 @@ Multiple Many-To-One create table orders ( id int primary key generated always as identity, name text, - billing_address_id int references addresses(id), - shipping_address_id int references addresses(id) + billing_address_id int, + shipping_address_id int, + constraint billing_address + foreign key(billing_address_id) references addresses(id), + constraint shipping_address + foreign key(shipping_address_id) references addresses(id) ); -To successfully join ``orders`` with ``addresses``, you need to create computed relationships for the foreign keys columns you want to use: - -.. code-block:: postgresql - - create function billing_address(orders) returns setof addresses rows 1 as $$ - select * from addresses where id = $1.billing_address_id - $$ stable language sql; - - create function shipping_address(orders) returns setof addresses rows 1 as $$ - select * from addresses where id = $1.shipping_address_id - $$ stable language sql; - -Now, we can unambiguously join the billing and shipping addresses. +To successfully join ``orders`` with the billing and shipping ``addresses``, use the corresponding foreign key constraints: .. tabs:: @@ -462,48 +447,36 @@ Now, we can unambiguously join the billing and shipping addresses. } ] -.. _multiple_o2m: - -Multiple One-To-Many --------------------- - -Let's take the tables from :ref:`multiple_m2o`. -To join ``addresses`` with ``orders``, you need to create computed relationships like these ones: - -.. code-block:: postgresql - - create function billing_orders(addresses) returns setof orders as $$ - select * from orders where billing_address_id = $1.id - $$ stable language sql; +.. _hint_disamb: - create function shipping_orders(addresses) returns setof orders as $$ - select * from orders where shipping_address_id = $1.id - $$ stable language sql; +Multiple FK Relationships to Many Resources +------------------------------------------- -Then, the request would look like: +Additionally, let's create two views for ``addresses``: ``central_addresses`` and ``eastern_addresses``. +Using the the view name is not enough to join ``orders`` with any of them. +To solve this, you need to add the foreign key as a hint: .. tabs:: .. code-tab:: http - GET /addresses?select=name,billing_orders(name),shipping_orders(name)&id=eq.1 HTTP/1.1 + GET /orders?select=name,central_addresses!billing_address(name),central_addresses!shipping_address(name) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/addresses?select=name,billing_orders(name),shipping_orders(name)&id=eq.1" + curl "http://localhost:3000/orders?select=name,central_addresses!billing_address(name),central_addresses!shipping_address(name)" .. code-block:: json [ { - "name": "32 Glenlake Dr.Dearborn, MI 48124", - "billing_orders": [ - { "name": "Personal Water Filter" }, - { "name": "Coffee Machine" } - ], - "shipping_orders": [ - { "name": "Coffee Machine" } - ] + "name": "Personal Water Filter", + "billing_address": { + "name": "32 Glenlake Dr.Dearborn, MI 48124" + }, + "shipping_address": { + "name": "30 Glenlake Dr.Dearborn, MI 48124" + } } ] From ddc24cf32864aea5776b5a69654c4a604a6e86bb Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 9 Aug 2023 20:17:32 -0500 Subject: [PATCH 15/20] clarify FK joins --- docs/_static/premieres.png | Bin 8990 -> 0 bytes docs/references/api/resource_embedding.rst | 305 +++++++++++---------- 2 files changed, 163 insertions(+), 142 deletions(-) delete mode 100644 docs/_static/premieres.png diff --git a/docs/_static/premieres.png b/docs/_static/premieres.png deleted file mode 100644 index 794e96767de072d6414630fc9fbfbeb24d4f9d9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8990 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, ``roles`` is taken as a join table. + +The join table is also detected if the composite key has additional columns. -Thus, it can detect the join table ``roles`` between ``films`` and ``actors``: +.. code-block:: postgresql + + create table roles( + id int generated always as identity, + , film_id int references films(id) + , actor_id int references actors(id) + , character text, + , primary key(id, film_id, actor_id) + ); .. tabs:: @@ -209,18 +228,6 @@ Thus, it can detect the join table ``roles`` between ``films`` and ``actors``: ".." ] -The join table can also be detected if the composite key has additional columns: - -.. code-block:: postgresql - - create table roles( - id int generated always as identity, - , film_id int references films(id) - , actor_id int references actors(id) - , character text, - , primary key(id, film_id, actor_id) - ); - .. _one-to-one: One-to-one relationships @@ -228,7 +235,7 @@ One-to-one relationships One-to-one relationships are detected in two ways. -- When the foreign key is a primary key as specified in the :ref:`DB structure example `. +- When the foreign key is a primary key as specified in the :ref:`sample film database `. - When the foreign key has a unique constraint. .. code-block:: postgresql @@ -265,30 +272,24 @@ One-to-one relationships are detected in two ways. Computed Relationships ====================== -You can manually define relationships between using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. +You can manually define relationships by using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. -.. tabs:: - - .. group-tab:: ERD - - .. image:: ../../_static/premieres.png - - .. code-tab:: postgresql SQL +.. code-block:: postgresql - create foreign table premieres ( - id integer, - location text, - "date" date, - film_id integer - ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); + create foreign table premieres ( + id integer, + location text, + "date" date, + film_id integer + ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); - create function film(premieres) returns setof films rows 1 as $$ - select * from films where id = $1.film_id - $$ stable language sql; + create function film(premieres) returns setof films rows 1 as $$ + select * from films where id = $1.film_id + $$ stable language sql; -The above function (see the **SQL** tab) defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. +The above function defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. The name of the function ``film`` is arbitrary and can be used to do the embedding: .. tabs:: @@ -363,36 +364,31 @@ Thanks to overloaded functions, you can use the same function name for different select * from directors where film_school_id = $1.id $$ stable language sql; -Computed relationships have good performance as their intended design enable `inlining `_. +Computed relationships have good performance as their intended design enable `function inlining `_. .. warning:: - - Always use ``SETOF`` when creating computed relationships. Functions can return a table without using ``SETOF``, but bear in mind that they will not be inlined. + - Always use ``SETOF`` when creating computed relationships. Functions can return a table without using ``SETOF``, but bear in mind that PostgreSQL will not inline them. - Make sure to correctly label the ``to-one`` part of the relationship. When using the ``ROWS 1`` estimation, PostgREST will expect a single row to be returned. If that is not the case, it will unnest the embedding and return repeated values for the top level resource. .. _embed_disamb: .. _target_disamb: +.. _hint_disamb: .. _complex_rels: -FK Joins on Multiple Foreign Key Relationships -============================================== +Foreign Key Joins on Multiple Foreign Key Relationships +======================================================= When there are multiple foreign keys between tables, :ref:`fk_join` need disambiguation to resolve which foreign key columns to use for the join. +To do this, you can specify a foreign key by using the ``!hint`` syntax. -.. code:: +.. _multiple_m2o: - HTTP/1.1 300 Multiple Choices - - { - "code": "PGRST201", - "details": [ "..." ], - "hint": "...", - "message": "Could not embed because more than one relationship was found for 'sites' and 'big_projects'" - } +Multiple Many-To-One +-------------------- -Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. -For example, let's use the following tables: +For example, suppose you have the following ``orders`` and ``addresses`` tables: .. tabs:: @@ -415,23 +411,41 @@ For example, let's use the following tables: name text, billing_address_id int, shipping_address_id int, - constraint billing_address - foreign key(billing_address_id) references addresses(id), - constraint shipping_address - foreign key(shipping_address_id) references addresses(id) + constraint billing foreign key(billing_address_id) references addresses(id), + constraint shipping foreign key(shipping_address_id) references addresses(id) ); -To successfully join ``orders`` with the billing and shipping ``addresses``, use the corresponding foreign key constraints: +Since the ``orders`` table has two foreign keys to the ``addresses`` table, a foreign key join is ambiguous and PostgREST will respond with an error: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=*,addresses(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=*,addresses(*)" -i + + +.. code-block:: http + + HTTP/1.1 300 Multiple Choices + + {..} + + +To successfully join ``orders`` with ``addresses``, you can specify the foreign key name like so: .. tabs:: .. code-tab:: http - GET /orders?select=name,billing_address(name),shipping_address(name) HTTP/1.1 + GET /orders?select=name,billing_address:addresses!billing(name),shipping_address:addresses!shipping(name) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/orders?select=name,billing_address(name),shipping_address(name)" + curl "http://localhost:3000/orders?select=name,billing_address:addresses!billing(name),shipping_address:addresses!shipping(name)" .. code-block:: json @@ -447,43 +461,49 @@ To successfully join ``orders`` with the billing and shipping ``addresses``, use } ] -.. _hint_disamb: +Note that ``!billing`` and ``!shipping`` are foreign keys names, which have been named explicitly in the :ref:`SQL definition above `. + +.. _multiple_o2m: -Multiple FK Relationships to Many Resources -------------------------------------------- +Multiple One-To-Many +-------------------- -Additionally, let's create two views for ``addresses``: ``central_addresses`` and ``eastern_addresses``. -Using the the view name is not enough to join ``orders`` with any of them. -To solve this, you need to add the foreign key as a hint: +Let's take the tables from :ref:`multiple_m2o`. To get the opposite one-to-many relationship, we can also specify the foreign key name: .. tabs:: .. code-tab:: http - GET /orders?select=name,central_addresses!billing_address(name),central_addresses!shipping_address(name) HTTP/1.1 + GET /addresses?select=name,billing_orders:orders!billing(name),shipping_orders!shipping(name)&id=eq.1 HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/orders?select=name,central_addresses!billing_address(name),central_addresses!shipping_address(name)" + curl "http://localhost:3000/addresses?select=name,billing_orders:orders!billing(name),shipping_orders!shipping(name)&id=eq.1" .. code-block:: json [ { - "name": "Personal Water Filter", - "billing_address": { - "name": "32 Glenlake Dr.Dearborn, MI 48124" - }, - "shipping_address": { - "name": "30 Glenlake Dr.Dearborn, MI 48124" - } + "name": "32 Glenlake Dr.Dearborn, MI 48124", + "billing_orders": [ + { "name": "Personal Water Filter" }, + { "name": "Coffee Machine" } + ], + "shipping_orders": [ + { "name": "Coffee Machine" } + ] } ] +Recursive Relationships +----------------------- + +To disambiguate recursive relationships, PostgREST requires :ref:`computed_relationships`. + .. _recursive_o2o_embed: Recursive One-To-One --------------------- +~~~~~~~~~~~~~~~~~~~~ .. tabs:: @@ -541,7 +561,7 @@ Now, to query a president with their predecessor and successor: .. _recursive_o2m_embed: Recursive One-To-Many ---------------------- +~~~~~~~~~~~~~~~~~~~~~ .. tabs:: @@ -593,7 +613,7 @@ Now, the query would be: .. _recursive_m2o_embed: Recursive Many-To-One ----------------------- +~~~~~~~~~~~~~~~~~~~~~~ Let's take the same ``employees`` table from :ref:`recursive_o2m_embed`. To get the Many-To-One relationship, that is, the employees with their respective supervisor, you need to create a function like this one: @@ -630,7 +650,7 @@ Then, the query would be: .. _recursive_m2m_embed: Recursive Many-To-Many ----------------------- +~~~~~~~~~~~~~~~~~~~~~~ .. tabs:: @@ -703,8 +723,8 @@ Then, the request would be: .. _embedding_partitioned_tables: -FK Joins on Partitioned Tables -============================== +Foreign Key Joins on Partitioned Tables +======================================= Foreign Key joins can also be done between `partitioned tables `_ and other tables. @@ -749,17 +769,17 @@ Since it contains the ``films_id`` foreign key, it is possible to join ``box_off .. note:: - * FK joins on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`computed_relationships` can be used if this is needed. + * Foreign key joins on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`computed_relationships` can be used if this is needed. * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. .. _embedding_views: -FK Joins on Views -================= +Foreign Key Joins on Views +========================== -PostgREST will infer the relationships of a view based on its base tables. Base tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. -The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. +PostgREST will infer the foreign keys of a view using its base tables. Base tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. +The foreign keys' columns must be present in the top ``SELECT`` clause of the view for this to work. For instance, the following view has ``nominations``, ``films`` and ``competitions`` as base tables: @@ -792,7 +812,7 @@ It's also possible to foreign key join `Materialized Views `_. This may fail depending on the complexity of the view. @@ -802,15 +822,15 @@ It's also possible to foreign key join `Materialized Views ` that returns a table type, you can do a Foreign Key join on the result. @@ -845,6 +865,59 @@ A request with ``directors`` embedded: } ] +.. _mutation_embed: + +Foreign Key Joins on Writes +=========================== + +You can join related database objects after doing :ref:`insert`, :ref:`update` or :ref:`delete`. + +Say you want to insert a **film** and then get some of its attributes plus join its **director**. + +.. tabs:: + + .. code-tab:: http + + POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 + Prefer: return=representation + + { + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,year,director:directors(first_name,last_name)" \ + -H "Prefer: return=representation" \ + -d @- << EOF + { + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" + } + EOF + +Response: + +.. code-block:: json + + { + "title": "127 hours", + "year": 2010, + "director": { + "first_name": "Danny", + "last_name": "Boyle" + } + } + .. _nested_embedding: Nested Embedding @@ -1157,55 +1230,3 @@ You can use this to get the columns of a join table in a many-to-many relationsh The spread operator ``...`` is borrowed from the Javascript `spread syntax `_. -.. _mutation_embed: - -Embedding after Insertions/Updates/Deletions -============================================ - -You can embed related resources after doing :ref:`insert`, :ref:`update` or :ref:`delete`. - -Say you want to insert a **film** and then get some of its attributes plus embed its **director**. - -.. tabs:: - - .. code-tab:: http - - POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 - Prefer: return=representation - - { - "id": 100, - "director_id": 40, - "title": "127 hours", - "year": 2010, - "rating": 7.6, - "language": "english" - } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,year,director:directors(first_name,last_name)" \ - -H "Prefer: return=representation" \ - -d @- << EOF - { - "id": 100, - "director_id": 40, - "title": "127 hours", - "year": 2010, - "rating": 7.6, - "language": "english" - } - EOF - -Response: - -.. code-block:: json - - { - "title": "127 hours", - "year": 2010, - "director": { - "first_name": "Danny", - "last_name": "Boyle" - } - } From 2e71a85c021671b8414f52ce49dbff1e34d819d0 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 9 Aug 2023 23:48:18 -0500 Subject: [PATCH 16/20] add disamb error --- docs/references/api/resource_embedding.rst | 28 +++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 6e12171c2..4aa29d663 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -15,7 +15,7 @@ table-valued functions. - For tables, it generates a join condition using the foreign keys columns (respecting composite keys). - For views, it generates a join condition using the views' base tables foreign key columns. -- For table-valued functions, it generates a join condition based on the foreign key columns of the function return type. +- For table-valued functions, it generates a join condition based on the foreign key columns of the returned table type. .. important:: @@ -381,7 +381,7 @@ Foreign Key Joins on Multiple Foreign Key Relationships ======================================================= When there are multiple foreign keys between tables, :ref:`fk_join` need disambiguation to resolve which foreign key columns to use for the join. -To do this, you can specify a foreign key by using the ``!hint`` syntax. +To do this, you can specify a foreign key by using the ``!`` syntax. .. _multiple_m2o: @@ -432,10 +432,28 @@ Since the ``orders`` table has two foreign keys to the ``addresses`` table, a fo HTTP/1.1 300 Multiple Choices - {..} +.. code-block:: json + { + "code": "PGRST201", + "details": [ + { + "cardinality": "many-to-one", + "embedding": "orders with addresses", + "relationship": "billing using orders(billing_address_id) and addresses(id)" + }, + { + "cardinality": "many-to-one", + "embedding": "orders with addresses", + "relationship": "shipping using orders(shipping_address_id) and addresses(id)" + } + ], + "hint": "Try changing 'addresses' to one of the following: 'addresses!billing', 'addresses!shipping'. Find the desired relationship in the 'details' key.", + "message": "Could not embed because more than one relationship was found for 'orders' and 'addresses'" + } -To successfully join ``orders`` with ``addresses``, you can specify the foreign key name like so: +To successfully join ``orders`` with ``addresses``, we can follow the error ``hint`` which tells us to add the foreign key name as ``!billing`` or ``!shipping``. +Note that the foreign keys have been named explicitly in the :ref:`SQL definition above `. To make the result clearer we'll also alias the tables: .. tabs:: @@ -461,8 +479,6 @@ To successfully join ``orders`` with ``addresses``, you can specify the foreign } ] -Note that ``!billing`` and ``!shipping`` are foreign keys names, which have been named explicitly in the :ref:`SQL definition above `. - .. _multiple_o2m: Multiple One-To-Many From 3a6e5026bed9b5a0039309457daf2ac1f22418e9 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 10 Aug 2023 01:15:59 -0500 Subject: [PATCH 17/20] add note to impersonated role settings --- docs/references/auth.rst | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/docs/references/auth.rst b/docs/references/auth.rst index a25b08be1..3e7428f2e 100644 --- a/docs/references/auth.rst +++ b/docs/references/auth.rst @@ -37,6 +37,24 @@ The picture below shows how the server handles authentication. If auth succeeds, This role switching mechanism is called **user impersonation**. In PostgreSQL it's done with the ``SET ROLE`` statement. +.. _impersonated_settings: + +Impersonated Role Settings +-------------------------- + +The impersonated role has its settings applied. For example, if you do: + +.. code-block:: postgresql + + ALTER ROLE webuser SET statement_timeout TO '5s'; + +Every ``webuser`` :ref:`transaction ` gets its queries executed with a ``statement_timeout`` of 5 seconds. + +.. note:: + + Settings that have a high privilege context (like ``superuser``) won't be applied, only settings that have a ``user`` context will be. This is so we don't cause permission errors. + For more details see `Understanding Postgres Parameter Context `_. + .. _jwt_impersonation: JWT-Based User Impersonation @@ -71,7 +89,7 @@ If the client included no JWT (or one without a role claim) then PostgREST switc JWT Generation ~~~~~~~~~~~~~~ -You can create a valid JWT either from inside your database(see :ref:`sql_user_management`) or via an external service(see :ref:`external_jwt`). +You can create a valid JWT either from inside your database (see :ref:`sql_user_management`) or via an external service (see :ref:`external_jwt`). .. _client_auth: @@ -188,16 +206,3 @@ doing custom logic based on the web user info. END IF; END $$ LANGUAGE plpgsql; - -.. _impersonated_settings: - -Impersonated Role Settings --------------------------- - -The :ref:`Impersonated Role ` settings are applied. For example, if you do: - -.. code-block:: postgresql - - ALTER ROLE webuser SET statement_timeout TO '5s'; - -Every ``webuser`` :ref:`transaction ` gets its queries executed with a ``statement_timeout`` of 5 seconds. From cc0de40b3f92937f36a79c423b2513367dd63efe Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 10 Aug 2023 01:24:02 -0500 Subject: [PATCH 18/20] add preference-applied for return=* --- docs/references/api/tables_views.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 469ad612f..518a58e2e 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -750,6 +750,7 @@ If the table has a primary key, the response can contain a :code:`Location` head HTTP/1.1 201 Created Location: /projects?id=eq.34 + Preference-Applied: return=headers-only Prefer: return=representation ----------------------------- @@ -775,7 +776,7 @@ On the other end of the spectrum you can get the full created object back in the .. code:: HTTP/1.1 201 Created - Transfer-Encoding: chunked + Preference-Applied: return=representation [ { From c2ac058829198cbbf56110e3a9e17b6198d2ffe2 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 10 Aug 2023 02:11:41 -0500 Subject: [PATCH 19/20] add nulls=stripped --- .../api/resource_representation.rst | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/references/api/resource_representation.rst b/docs/references/api/resource_representation.rst index 8a1f80529..76c0c5511 100644 --- a/docs/references/api/resource_representation.rst +++ b/docs/references/api/resource_representation.rst @@ -85,6 +85,43 @@ When a singular response is requested but no entries are found, the server respo Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. +Stripped Nulls +-------------- + +By default PostgREST returns all JSON null values. For example, requesting ``/projects?id=gt.10`` returns + +.. code:: json + + [ + { "id": 11, "name": "OSX", "client_id": 1, "another_col": "val" }, + { "id": 12, "name": "ProjectX", "client_id": null, "another_col": null }, + { "id": 13, "name": "Y", "client_id": null, "another_col": null } + ] + +On large result sets, the unused keys with ``null`` values can waste bandwith unnecessarily. To remove them, specify ``nulls=stripped`` as a parameter of ``application/vnd.pgrst.array``: + +.. tabs:: + + .. code-tab:: http + + GET /projects?id=gt.10 HTTP/1.1 + Accept: application/vnd.pgrst.array+json;nulls=stripped + + .. code-tab:: bash Curl + + curl "http://localhost:3000/projects?id=gt.10" \ + -H "Accept: application/vnd.pgrst.array+json;nulls=stripped" + +This returns + +.. code:: json + + [ + { "id": 11, "name": "OSX", "client_id": 1, "another_col": "val" }, + { "id": 12, "name": "ProjectX" }, + { "id": 13, "name": "Y"} + ] + .. _scalar_return_formats: Scalar Function Response Format From 3a611116aceafded9c466683d9359d3ddb703fd0 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 10 Aug 2023 02:27:21 -0500 Subject: [PATCH 20/20] add setof record functions --- docs/references/api/stored_procedures.rst | 33 +++++++++++++++++++++++ postgrest.dict | 1 + 2 files changed, 34 insertions(+) diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index e5098864b..9aa28d9e2 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -420,6 +420,39 @@ PostgREST will detect if the function is scalar or table-valued and will shape t To manually choose a return format such as binary, plain text or XML, see the section :ref:`scalar_return_formats`. +.. _untyped_functions: + +Untyped functions +----------------- + +Functions that return ``record`` or ``SETOF record`` are supported: + +.. code-block:: postgres + + create function projects_setof_record() returns setof record as $$ + select * from projects; + $$ language sql; + +.. tabs:: + + .. code-tab:: http + + GET /rpc/projects_setof_record HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/projects_setof_record" + +.. code-block:: json + + [{"id":1,"name":"Windows 7","client_id":1}, + {"id":2,"name":"Windows 10","client_id":1}, + {"id":3,"name":"IOS","client_id":2}] + +However note that they will fail when trying to use :ref:`v_filter` and :ref:`h_filter` on them. + +So while they can be used for quick tests, it's recommended to always choose a strict return type for the function. + Overloaded functions -------------------- diff --git a/postgrest.dict b/postgrest.dict index c5070d1dd..f4aa4dd42 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -182,6 +182,7 @@ unicode unikernel unix updatable +Untyped UPSERT Upsert upsert