graphql-engine/docs/graphql/manual/schema/default-values/sql-functions.rst
2018-12-03 17:42:24 +05:30

99 lines
3.0 KiB
ReStructuredText

Setting values of fields using SQL functions/stored procedures
==============================================================
.. contents:: Table of contents
:backlinks: none
:depth: 1
:local:
Let's say you want to set the value of some fields as the output of some custom SQL functions or stored procedures.
This is useful to set values of fields which depend on other fields passed in the input. e.g. set
``submission_time`` of an online quiz as 1 hour from the ``start_time``.
This can be achieved by:
#. Modifying the table to allow the columns we want to be set by the SQL functions to be nullable (to allow the initial
insert before the SQL function is run).
#. Creating an insert/update trigger on the table that calls your SQL function and sets the output values in the output
columns.
#. Making your mutation requests without setting the SQL function output columns.
.. note::
This approach enforces the value set in the field to always be the result of the defined SQL function even if a
value is explicitly passed in the insert object.
**For example**, say we have a table ``sql_function_table`` with columns ``input`` and ``output`` and we would like
to set the value of the ``output`` column as the uppercased value of the string received in the ``input`` field.
Step 1: Modify the table
------------------------
Modify the table ``sql_function_table`` and make its ``output`` column nullable.
Open the console and head to ``Data -> sql_function_table -> Modify``:
.. image:: ../../../../img/graphql/manual/schema/modify-sql-fn-table.png
Step 2: Create a trigger
------------------------
The below SQL defines a ``trigger`` which will simply uppercase the value passed in the ``input`` field and set it to
the ``output`` field whenever an insert or update is made to the ``sql_function_table``:
.. code-block:: plpgsql
CREATE FUNCTION test_func() RETURNS trigger AS $emp_stamp$
BEGIN
NEW.output := UPPER(NEW.input);
RETURN NEW;
END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER test_trigger BEFORE INSERT OR UPDATE ON sql_function_table
FOR EACH ROW EXECUTE PROCEDURE test_func();
Head to ``Data -> SQL`` and run the above SQL:
.. image:: ../../../../img/graphql/manual/schema/create-trigger.png
Step 3: Run an insert mutation
------------------------------
Run a mutation to insert an object with (input = "yabba dabba doo!", output=null) and you'll see the output
value (output="YABBA DABBA DOO!") will be set automatically.
.. graphiql::
:view_only:
:query:
mutation {
insert_sql_function_table (
objects: [
{input: "yabba dabba doo!"}
]
) {
returning {
input
output
}
}
}
:response:
{
"data": {
"insert_sql_function_table": {
"returning": [
{
"input": "yabba dabba doo!",
"output": "YABBA DABBA DOO!"
}
]
}
}
}
Also see
--------
- :doc:`postgres-defaults`
- :doc:`column-presets`