Accessing Tailor DB
In order to access Tailor DB from Function service, you need to instantiate the Client
object from the tailordb
package.
tailordb
exists in the Function service environment by default, so you can use it without any additional installation.
Please specify the namespace
of the Tailor DB you want to connect to when creating the Client
object.
Here is the Client
interface:
<span><span style="color: var(--shiki-token-keyword)">export</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">interface</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Client</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">connect</span><span style="color: var(--shiki-color-text)">()</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Promise</span><span style="color: var(--shiki-color-text)"><</span><span style="color: var(--shiki-token-constant)">void</span><span style="color: var(--shiki-color-text)">>;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">end</span><span style="color: var(--shiki-color-text)">()</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Promise</span><span style="color: var(--shiki-color-text)"><</span><span style="color: var(--shiki-token-constant)">void</span><span style="color: var(--shiki-color-text)">>;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">queryObject</span><span style="color: var(--shiki-color-text)"><</span><span style="color: var(--shiki-token-function)">T</span><span style="color: var(--shiki-color-text)">>(sql</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">string</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> args</span><span style="color: var(--shiki-token-keyword)">?:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">readonly</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">any</span><span style="color: var(--shiki-color-text)">[])</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Promise</span><span style="color: var(--shiki-color-text)"><{ rows</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">T</span><span style="color: var(--shiki-color-text)">[] }>;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">createTransaction</span><span style="color: var(--shiki-color-text)">(name</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">string</span><span style="color: var(--shiki-color-text)">)</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Transaction</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)">(config</span><span style="color: var(--shiki-token-keyword)">?:</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-keyword)">?:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">string</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-color-text)"> })</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Client</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">type</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Transaction</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">begin</span><span style="color: var(--shiki-color-text)">()</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Promise</span><span style="color: var(--shiki-color-text)"><</span><span style="color: var(--shiki-token-constant)">void</span><span style="color: var(--shiki-color-text)">>;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">commit</span><span style="color: var(--shiki-color-text)">()</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Promise</span><span style="color: var(--shiki-color-text)"><</span><span style="color: var(--shiki-token-constant)">void</span><span style="color: var(--shiki-color-text)">>;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">rollback</span><span style="color: var(--shiki-color-text)">()</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Promise</span><span style="color: var(--shiki-color-text)"><</span><span style="color: var(--shiki-token-constant)">void</span><span style="color: var(--shiki-color-text)">>;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">queryObject</span><span style="color: var(--shiki-color-text)"><</span><span style="color: var(--shiki-token-function)">T</span><span style="color: var(--shiki-color-text)">>(sql</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">string</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> args</span><span style="color: var(--shiki-token-keyword)">?:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">readonly</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">any</span><span style="color: var(--shiki-color-text)">[])</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Promise</span><span style="color: var(--shiki-color-text)"><{ rows</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">T</span><span style="color: var(--shiki-color-text)">[] }>;</span></span>
<span><span style="color: var(--shiki-color-text)">};</span></span>
<span></span>
Please refer to the Supported SQL queries for more information on the SQL syntax supported in Client.queryObject
.
Sample codes to access Tailor DB in JavaScript
Getting data from Tailor DB
<span><span style="color: var(--shiki-token-constant)">globalThis</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-function)">main</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">async</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">function</span><span style="color: var(--shiki-color-text)"> () {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.Client</span><span style="color: var(--shiki-color-text)">({</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"ims"</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> });</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-token-function)">.connect</span><span style="color: var(--shiki-color-text)">();</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">product</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-token-function)">.queryObject</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"SELECT * FROM Product"</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-token-function)">.end</span><span style="color: var(--shiki-color-text)">();</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">return</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Product"</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">product</span><span style="color: var(--shiki-color-text)">.rows</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> };</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
Inserting data to Tailor DB
<span><span style="color: var(--shiki-token-constant)">globalThis</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-function)">main</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">async</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">function</span><span style="color: var(--shiki-color-text)"> (args) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.Client</span><span style="color: var(--shiki-color-text)">({</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"ims"</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> });</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-token-function)">.connect</span><span style="color: var(--shiki-color-text)">();</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">try</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">millis</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">Date</span><span style="color: var(--shiki-token-function)">.now</span><span style="color: var(--shiki-color-text)">()</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">products</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-token-function)">.queryObject</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"SELECT * FROM Product"</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">len</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">products</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">rows</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">length</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (len </span><span style="color: var(--shiki-token-keyword)">!==</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0</span><span style="color: var(--shiki-color-text)">) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">throw</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Error</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`The size of Product, expected:0 got:</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">len</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">)</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">fixtures</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> [</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">millis</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> - Product 1`</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">millis</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> - Product 2`</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">millis</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> - Product 3`</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">millis</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> - Product 4`</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> ]</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">transaction</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-token-function)">.createTransaction</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"add_products"</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">try</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">transaction</span><span style="color: var(--shiki-token-function)">.begin</span><span style="color: var(--shiki-color-text)">();</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">for</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">i</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">of</span><span style="color: var(--shiki-color-text)"> fixtures) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">ret</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">transaction</span><span style="color: var(--shiki-token-function)">.queryObject</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`INSERT INTO Product (title) VALUES ('</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">i</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">')`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">transaction</span><span style="color: var(--shiki-token-function)">.commit</span><span style="color: var(--shiki-color-text)">();</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">products</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-token-function)">.queryObject</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`SELECT * FROM Product WHERE title like '</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">millis</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">%'`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">len</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">products</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">rows</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">length</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (len </span><span style="color: var(--shiki-token-keyword)">!==</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">4</span><span style="color: var(--shiki-color-text)">) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">throw</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Error</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`The size of Product, expected:4 got:</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">len</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">)</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">return</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> success</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> len </span><span style="color: var(--shiki-token-keyword)">===</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">4</span></span>
<span><span style="color: var(--shiki-color-text)"> };</span></span>
<span><span style="color: var(--shiki-color-text)"> } </span><span style="color: var(--shiki-token-keyword)">catch</span><span style="color: var(--shiki-color-text)"> (e) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">throw</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Error</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`add_products failed with error:</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">e</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">\n</span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">e</span><span style="color: var(--shiki-color-text)">.cause</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">)</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> } </span><span style="color: var(--shiki-token-keyword)">finally</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">client</span><span style="color: var(--shiki-token-function)">.end</span><span style="color: var(--shiki-color-text)">();</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
Deploy sample functions
Directory Structure
Here's the sample directory structure for a Terraform project.
Let's deploy the insert_data_function.js
to Tailor Platform.
In this example, we placed the function code in the scripts
directory.
Since we don't use npm packages in this example, we don't need to bundle the function.
<span><span style="color: var(--shiki-token-function)">.</span></span>
<span><span style="color: var(--shiki-token-function)">├──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">applications.tf</span></span>
<span><span style="color: var(--shiki-token-function)">├──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">pipeline.tf</span></span>
<span><span style="color: var(--shiki-token-function)">├──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">pipeline_insert_data_function.tf</span></span>
<span><span style="color: var(--shiki-token-function)">├──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">schema</span></span>
<span><span style="color: var(--shiki-token-function)">│ </span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">└──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">insert_data_function.graphql</span></span>
<span><span style="color: var(--shiki-token-function)">├──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">scripts</span></span>
<span><span style="color: var(--shiki-token-function)">│ </span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">└──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">insert_data_function.js</span></span>
<span><span style="color: var(--shiki-token-function)">├──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">tailordb.tf</span></span>
<span><span style="color: var(--shiki-token-function)">├──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">variables.tf</span></span>
<span><span style="color: var(--shiki-token-function)">└──</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">workspaces.tf</span></span>
<span></span>
Pipeline Resolver Example
In order to run your function script, specify the function
object inside the Pipeline step's operation.
Here's an example of Terraform code to set up the function in the Pipeline resolver.
<span><span style="color: var(--shiki-color-text)">resource </span><span style="color: var(--shiki-token-string-expression)">"tailor_pipeline_resolver"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"pipeline_insert_data_function"</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> workspace_id </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailor_workspace</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">ims</span><span style="color: var(--shiki-color-text)">.id</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailor_pipeline</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">ims</span><span style="color: var(--shiki-color-text)">.namespace</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"insertData"</span></span>
<span><span style="color: var(--shiki-color-text)"> description </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"sample mutation resolver"</span></span>
<span><span style="color: var(--shiki-color-text)"> authorization </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> insecure </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> sdl </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">file</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"${path.module}/schema/insert_data_function.graphql"</span><span style="color: var(--shiki-color-text)">)</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> steps </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> [</span></span>
<span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"insertData"</span></span>
<span><span style="color: var(--shiki-color-text)"> operation </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">function</span><span style="color: var(--shiki-color-text)"> = {</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"insertData"</span></span>
<span><span style="color: var(--shiki-color-text)"> script </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">file</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"${path.module}/scripts/insert_data_function.js"</span><span style="color: var(--shiki-color-text)">)</span></span>
<span><span style="color: var(--shiki-color-text)"> variables </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"({ title: context.args.input.title })"</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> post_script </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> <<</span><span style="color: var(--shiki-token-function)">EOF</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">args</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-function)">insertData</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">EOF</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> ]</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">input</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">insertDataInput</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> title: </span><span style="color: var(--shiki-token-constant)">String</span><span style="color: var(--shiki-token-keyword)">!</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span><span style="color: var(--shiki-token-keyword)">type</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">insertDataResponse</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> success: </span><span style="color: var(--shiki-token-constant)">Boolean</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span><span style="color: var(--shiki-token-keyword)">extend</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">type</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">Mutation</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> insertData(input: </span><span style="color: var(--shiki-token-constant)">insertDataInput</span><span style="color: var(--shiki-token-keyword)">!</span><span style="color: var(--shiki-color-text)">): </span><span style="color: var(--shiki-token-constant)">insertDataResponse</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
TailorDB Example
To execute the function, you need to set up the Episode table in TailorDB.
<span><span style="color: var(--shiki-color-text)">resource </span><span style="color: var(--shiki-token-string-expression)">"tailor_tailordb"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"ims"</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> workspace_id </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailor_workspace</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">ims</span><span style="color: var(--shiki-color-text)">.id</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"ims"</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)">resource </span><span style="color: var(--shiki-token-string-expression)">"tailor_tailordb_type"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"product"</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> workspace_id </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailor_workspace</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">ims</span><span style="color: var(--shiki-color-text)">.id</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailor_tailordb</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">ims</span><span style="color: var(--shiki-color-text)">.namespace</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Product"</span></span>
<span><span style="color: var(--shiki-color-text)"> description </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Product data schema"</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> fields </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> title </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> type </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"string"</span></span>
<span><span style="color: var(--shiki-color-text)"> description </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Title of the product"</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> type_permission </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">local</span><span style="color: var(--shiki-color-text)">.permission_everyone</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-comment)">// you can update here per your requirement</span></span>
<span><span style="color: var(--shiki-color-text)"> locals {</span></span>
<span><span style="color: var(--shiki-color-text)"> permission_everyone </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> create </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> [</span></span>
<span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> attribute </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"everyone"</span></span>
<span><span style="color: var(--shiki-color-text)"> permit </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"allow"</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> ]</span></span>
<span><span style="color: var(--shiki-color-text)"> read </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> [</span></span>
<span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> attribute </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"everyone"</span></span>
<span><span style="color: var(--shiki-color-text)"> permit </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"allow"</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> ]</span></span>
<span><span style="color: var(--shiki-color-text)"> update </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> [</span></span>
<span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> attribute </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"everyone"</span></span>
<span><span style="color: var(--shiki-color-text)"> permit </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"allow"</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> ]</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">delete</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> [</span></span>
<span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> attribute </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"everyone"</span></span>
<span><span style="color: var(--shiki-color-text)"> permit </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"allow"</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> ]</span></span>
<span><span style="color: var(--shiki-color-text)"> admin </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> [</span></span>
<span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> attribute </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"everyone"</span></span>
<span><span style="color: var(--shiki-color-text)"> permit </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"allow"</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> ]</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
Deployment
Let's deploy the function to Tailor Platform.
<span><span style="color: var(--shiki-token-function)">terraform</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">apply</span></span>
<span></span>
Supported SQL queries
Strictly speaking, the SQL statements here are executed via a proxy to Tailor DB.
The SQL that can be issued is a subset of PostgreSQL, so the fundamental syntax follows PostgreSQL conventions.
SELECT
Retrieve specific columns
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Retrieve all columns
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Join tables
Only records where the user has Read
permission for all joined records are returned.
Self-joins (joining the same table multiple times) are not supported.
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">JOIN</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Species"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">ON</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-string-expression)">"speciesID"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Species"</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Use table aliases
You can specify aliases for table names to make queries more concise and readable. This is particularly useful in complex queries with multiple joins.
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> c.</span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)">, s.</span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">AS</span><span style="color: var(--shiki-color-text)"> c </span><span style="color: var(--shiki-token-keyword)">LEFT JOIN</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Species"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">AS</span><span style="color: var(--shiki-color-text)"> s </span><span style="color: var(--shiki-token-keyword)">ON</span><span style="color: var(--shiki-color-text)"> c.</span><span style="color: var(--shiki-token-string-expression)">"speciesID"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> s.</span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
You can also omit the AS
keyword:
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> c.</span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">, s.</span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> c </span><span style="color: var(--shiki-token-keyword)">JOIN</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Species"</span><span style="color: var(--shiki-color-text)"> s </span><span style="color: var(--shiki-token-keyword)">ON</span><span style="color: var(--shiki-color-text)"> c.</span><span style="color: var(--shiki-token-string-expression)">"speciesID"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> s.</span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Filter by condition
For specific supported operators, see condition
in Syntax section.
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">WHERE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'Alice'</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Sort by column
As in PostgreSQL, when the order is omitted, the default is ASC
.
NULLS
cannot be specified, so null values are always treated as greater than non-null values.
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">ORDER BY</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">DESC</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Aggregate functions
You can use aggregate functions to perform calculations on sets of rows. The supported functions are COUNT
, SUM
, AVG
, MAX
, and MIN
.
COUNT function - Count rows or non-null values in specific columns:
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">count</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)">), </span><span style="color: var(--shiki-token-function)">count</span><span style="color: var(--shiki-color-text)">(id), </span><span style="color: var(--shiki-token-function)">count</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-keyword)">name</span><span style="color: var(--shiki-color-text)">), </span><span style="color: var(--shiki-token-function)">count</span><span style="color: var(--shiki-color-text)">(speciesID) </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
SUM function - Calculate the sum of numeric values (Integer and Float fields only):
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">sum</span><span style="color: var(--shiki-color-text)">(age), </span><span style="color: var(--shiki-token-function)">sum</span><span style="color: var(--shiki-color-text)">(height) </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
AVG function - Calculate the average of numeric values (Integer and Float fields only):
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">avg</span><span style="color: var(--shiki-color-text)">(age), </span><span style="color: var(--shiki-token-function)">avg</span><span style="color: var(--shiki-color-text)">(height) </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
MAX function - Find the maximum value:
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">max</span><span style="color: var(--shiki-color-text)">(age), </span><span style="color: var(--shiki-token-function)">max</span><span style="color: var(--shiki-color-text)">(height) </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
MIN function - Find the minimum value:
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">min</span><span style="color: var(--shiki-color-text)">(age), </span><span style="color: var(--shiki-token-function)">min</span><span style="color: var(--shiki-color-text)">(height) </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
You can also use column aliases with any aggregate function:
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">count</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">as</span><span style="color: var(--shiki-color-text)"> total, </span><span style="color: var(--shiki-token-function)">sum</span><span style="color: var(--shiki-color-text)">(age) </span><span style="color: var(--shiki-token-keyword)">as</span><span style="color: var(--shiki-color-text)"> total_age, </span><span style="color: var(--shiki-token-function)">avg</span><span style="color: var(--shiki-color-text)">(height) </span><span style="color: var(--shiki-token-keyword)">as</span><span style="color: var(--shiki-color-text)"> avg_height </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Aggregate functions with JOIN operations:
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">count</span><span style="color: var(--shiki-color-text)">(c.id), </span><span style="color: var(--shiki-token-function)">sum</span><span style="color: var(--shiki-color-text)">(c.age), </span><span style="color: var(--shiki-token-function)">avg</span><span style="color: var(--shiki-color-text)">(s.lifespan) </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">AS</span><span style="color: var(--shiki-color-text)"> c </span><span style="color: var(--shiki-token-keyword)">LEFT JOIN</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Species"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">AS</span><span style="color: var(--shiki-color-text)"> s </span><span style="color: var(--shiki-token-keyword)">ON</span><span style="color: var(--shiki-color-text)"> c.speciesID </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> s.id;</span></span>
<span></span>
Field type restrictions
Function | Allowed Field Types |
---|---|
SUM | Integer, Float |
AVG | Integer, Float |
MAX | Integer, Float, String, Enum, Date, Time, DateTime |
MIN | Integer, Float, String, Enum, Date, Time, DateTime |
COUNT | All field types |
Group by columns
You can use the GROUP BY
clause to group rows that have the same values in specified columns and perform aggregate calculations on each group.
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"speciesID"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-function)">COUNT</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">GROUP BY</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"speciesID"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Filter groups using HAVING
:
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"speciesID"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-function)">AVG</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"height"</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">GROUP BY</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"speciesID"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">HAVING</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">COUNT</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">></span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">5</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
For GraphQL-based aggregation queries in TailorDB, see TailorDB Aggregation.
Vector similarity search
You can use the vector_similarity
function to sort records by similarity to a natural language query. This function is only available for fields that have been configured as Vector Fields in your TailorDB schema.
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Product"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">ORDER BY</span><span style="color: var(--shiki-color-text)"> vector_similarity(</span><span style="color: var(--shiki-token-string-expression)">"description"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-string-expression)">'What products are associated with A and B?'</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">DESC</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">LIMIT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">5</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Important notes:
- If the specified field is not a Vector Field, an error will occur
- To retrieve the most similar records, be sure to explicitly use
DESC
in theORDER BY
clause - For more information on setting up Vector Fields, see Vector Search
Limit and offset the results
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">LIMIT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">1</span><span style="color: var(--shiki-color-text)"> OFFSET </span><span style="color: var(--shiki-token-constant)">1</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Lock rows
<span><span style="color: var(--shiki-token-keyword)">SELECT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FOR</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">UPDATE</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
INSERT
Insert a single row
As in TailorDB
, if no value is specified for id
, a new UUID is automatically generated.
<span><span style="color: var(--shiki-token-keyword)">INSERT INTO</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Starship"</span><span style="color: var(--shiki-color-text)"> (</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- String (text)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"crew"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- Int (int4)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"length"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- Float (float8)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"isArmed"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- Bool (bool)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"status"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- Enum (text)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"serialNumber"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- UUID (uuid)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"manufactureDate"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- Date (date)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"maintenanceTime"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- Time (time)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"lastLaunchDateTime"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- DateTime (timestamptz)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"hyperdriveRating"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-comment)">-- Nested (jsonb)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"manufacturers"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-comment)">-- String Array (_text)</span></span>
<span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">VALUES</span><span style="color: var(--shiki-color-text)"> (</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'Millennium Falcon'</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">4</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">34</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">75</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> TRUE,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'ACTIVE'</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'a845e77f-2bce-462a-9e25-8d9296c3545b'</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'1977-05-25'</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'22:00'</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'2019-12-20T00:00:00Z'</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'{"main": 0.5, "backup": 10.0}'</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">ARRAY</span><span style="color: var(--shiki-color-text)">['Corellian Engineering Corporation']</span></span>
<span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
Insert multiple rows
<span><span style="color: var(--shiki-token-keyword)">INSERT INTO</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">VALUES</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">'Alice'</span><span style="color: var(--shiki-color-text)">), (</span><span style="color: var(--shiki-token-string-expression)">'Bob'</span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
Insert default values
With support for DEFAULT
, fields can be explicitly omitted when values are automatically generated via Hooks, etc.
<span><span style="color: var(--shiki-token-keyword)">INSERT INTO</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-string-expression)">"createdAt"</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">VALUES</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">'Alice'</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-keyword)">DEFAULT</span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
When omitting all columns, DEFAULT VALUES
can be used.
<span><span style="color: var(--shiki-token-keyword)">INSERT INTO</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">DEFAULT</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">VALUES</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Upsert
The conflict target (e.g., id
in the example below) can only contain a single column.
Specify either id
or a column with Unique=true
.
<span><span style="color: var(--shiki-token-keyword)">INSERT INTO</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">VALUES</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">'a845e77f-2bce-462a-9e25-8d9296c3545b'</span><span style="color: var(--shiki-color-text)">, </span><span style="color: var(--shiki-token-string-expression)">'Alice'</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">ON</span><span style="color: var(--shiki-color-text)"> CONFLICT (</span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)">) DO </span><span style="color: var(--shiki-token-keyword)">UPDATE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">SET</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> EXCLUDED.</span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Return the inserted row
<span><span style="color: var(--shiki-token-keyword)">INSERT INTO</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">VALUES</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">'Alice'</span><span style="color: var(--shiki-color-text)">) RETURNING </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
UPDATE
Update specific columns
<span><span style="color: var(--shiki-token-keyword)">UPDATE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">SET</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'Alice'</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">WHERE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'a845e77f-2bce-462a-9e25-8d9296c3545b'</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Return the updated row
<span><span style="color: var(--shiki-token-keyword)">UPDATE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">SET</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'Alice'</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">WHERE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'a845e77f-2bce-462a-9e25-8d9296c3545b'</span><span style="color: var(--shiki-color-text)"> RETURNING </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Arithmetic updates
<span><span style="color: var(--shiki-token-keyword)">UPDATE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Starship"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">SET</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"crew"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"crew"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">+</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">5</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">WHERE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'a845e77f-2bce-462a-9e25-8d9296c3545b'</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
DELETE
Delete rows
<span><span style="color: var(--shiki-token-keyword)">DELETE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">WHERE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'a845e77f-2bce-462a-9e25-8d9296c3545b'</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Return the deleted row
<span><span style="color: var(--shiki-token-keyword)">DELETE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">FROM</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">WHERE</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"id"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'a845e77f-2bce-462a-9e25-8d9296c3545b'</span><span style="color: var(--shiki-color-text)"> RETURNING </span><span style="color: var(--shiki-token-keyword)">*</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Transaction
Insert multiple rows in a transaction
<span><span style="color: var(--shiki-token-keyword)">BEGIN</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-token-keyword)">INSERT INTO</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">VALUES</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">'Alice'</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-token-keyword)">INSERT INTO</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Character"</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">"name"</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-keyword)">VALUES</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-string-expression)">'Bob'</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-token-keyword)">COMMIT</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
Permission Enforcement
TailorDB Permission settings are enforced at the SQL level, based on PostgreSQL's Row-Level Security (RLS) specifications. When accessing TailorDB via the Function service, it's important to understand how the settings affect SQL operations.
Important Notes
- Hooks, Validate, Serial, OnConflict, and ForeignKey operations ignore Permission - This corresponds to PostgreSQL ignoring RLS for consistency checks
- Be mindful of covert channels - Users might infer other record values based on ForeignKey constraints even without Read Permission
SQL Operation Details
INSERT
- Execute Hooks/Serial
- Retrieve existing records by ON CONFLICT fields
- For INSERT case:
- Check Create Permission
- If RETURNING clause: Check Read Permission
- Execute Validate/ForeignKey
- For UPDATE case:
- Check Read Permission on record before update
- Continue with UPDATE flow
SELECT
- Retrieve records while filtering by Read Permission
UPDATE
- Retrieve records while filtering by Read Permission
- Execute Hooks
- Check Update Permission
- If RETURNING clause: Check Read Permission on updated record
- Execute Validate/ForeignKey
DELETE
- Retrieve records while filtering by Read Permission
- Check Delete Permission
- Execute ForeignKey
For more information on configuring TailroDB Permission, see the Permission documentation.
Syntax
statement ::=
select
| insert
| update
| delete
| begin
| commit
| rollback
select ::=
SELECT select_item [, ...]
FROM table_with_alias
[ join [...] ]
[ WHERE condition ]
[ GROUP BY qualified_column_name [, ...] ]
[ HAVING condition ]
[ ORDER BY column_name_or_vector [ ASC | DESC ] [, ...] ]
[ LIMIT int_value ]
[ OFFSET int_value ]
[ FOR { UPDATE | SHARE } [...] ]
table_with_alias ::=
table_name [ [ AS ] alias ]
select_item ::=
qualified_column_name [ AS alias ]
| [ table_name . ] *
| aggregate_function [ AS alias ]
aggregate_function ::=
COUNT ( { [ DISTINCT ] qualified_column_name | * } )
| { SUM | AVG | MIN | MAX } ( [ DISTINCT ] qualified_column_name )
join ::=
[ INNER | { LEFT | RIGHT | FULL } [ OUTER ] ] JOIN table_with_alias ON condition
| CROSS JOIN table_with_alias
column_name_or_vector ::=
qualified_column_name
| vector_similarity ( qualified_column_name , column_value )
insert ::=
INSERT INTO table_name
{ ( column_name [, ...] ) VALUES ( { column_value | DEFAULT } [, ...] ) [, ...]
| DEFAULT VALUES }
[ ON CONFLICT ( column_name ) conflict_action ]
[ RETURNING select_item [, ...] ]
conflict_action ::=
DO NOTHING
| DO UPDATE SET column_name = { column_value | EXCLUDED . column_name } [, ...]
[ WHERE condition ]
update ::=
UPDATE table_name
SET column_name = column_name_or_value [ arithmetic_operator column_name_or_value ] [, ...]
[ WHERE condition ]
[ RETURNING select_item [, ...] ]
arithmetic_operator ::=
+ | - | * | /
delete ::=
DELETE FROM table_name
[ WHERE condition ]
[ RETURNING select_item [, ...] ]
begin ::=
{ BEGIN [ WORK | TRANSACTION ] | START TRANSACTION }
[ transaction_mode [, ...] ]
transaction_mode ::=
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
| READ WRITE | READ ONLY
| [ NOT ] DEFERRABLE
commit ::=
COMMIT [ WORK | TRANSACTION ]
rollback ::=
ROLLBACK [ WORK | TRANSACTION ]
condition ::=
left_operand binary_operator column_name_or_value
| left_operand [ NOT ] IN ( column_name_or_value [, ...] )
| left_operand [ NOT ] BETWEEN column_name_or_value AND column_name_or_value
| left_operand IS [ NOT ] NULL
| condition { AND | OR } condition
| ( condition )
left_operand ::=
qualified_column_name
| aggregate_function
binary_operator ::=
= | <> | < | <= | > | >=
| ~~ | !~~ | ~~* | !~~*
| ~ | !~ | ~* | !~*
| [ NOT ] LIKE | [ NOT ] ILIKE
column_name_or_value ::=
qualified_column_name
| column_value
qualified_column_name ::=
[ table_or_alias . ] column_name
table_or_alias ::=
table_name | alias
Working with FilesPreview
TailorDB File Type can be accessed programmatically from functions using the tailordb.file
API. This allows you to upload, download, and manage files directly within your function code. For GraphQL-based file operations and HTTP endpoints, see the File Type documentation.
The file API is available through the global tailordb
object in your function runtime and provides methods for complete file lifecycle management.
Upload Files
You can upload files by providing either string content or binary data as a Uint8Array
. The upload method returns metadata about the uploaded file.
<span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">uploadResponse</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.upload</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"File content as string"</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> { contentType</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"text/plain"</span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Uploaded: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">uploadResponse</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.fileSize</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> bytes`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`SHA256: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">uploadResponse</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.sha256sum</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
For binary files like images, use Uint8Array
:
<span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">pngData</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Uint8Array</span><span style="color: var(--shiki-color-text)">([</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0x89</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0x50</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0x4E</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0x47</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0x0D</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0x0A</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0x1A</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0x0A</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">]);</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">imageUploadResponse</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.upload</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> pngData</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> { contentType</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"image/png"</span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
Download Files
Download files to retrieve both the file content and metadata. The content is returned as a Uint8Array
.
<span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">downloadResponse</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.download</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId</span></span>
<span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Downloaded: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">downloadResponse</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.fileSize</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> bytes`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Content type: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">downloadResponse</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.contentType</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">textContent</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">TextDecoder</span><span style="color: var(--shiki-color-text)">()</span><span style="color: var(--shiki-token-function)">.decode</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-constant)">downloadResponse</span><span style="color: var(--shiki-color-text)">.data);</span></span>
<span></span>
The download response includes:
data
: The file content asUint8Array
metadata
: File metadata object (see API Reference below)
Get File Metadata
Retrieve file metadata without downloading the actual file content. This is useful for checking file properties without the overhead of downloading the entire file.
<span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.getMetadata</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId</span></span>
<span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Content Type: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.contentType</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`File Size: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.fileSize</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> bytes`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`SHA256: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.sha256sum</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Last Uploaded: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.lastUploadedAt</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
Stream Large Files
For large files, use streaming download to process files efficiently without loading the entire content into memory at once. The stream uses an async iterator pattern.
<span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">stream</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.openDownloadStream</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId</span></span>
<span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">let</span><span style="color: var(--shiki-color-text)"> totalBytes </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-token-keyword)">let</span><span style="color: var(--shiki-color-text)"> reconstructedData</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Uint8Array</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">|</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">null</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">null</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-token-keyword)">let</span><span style="color: var(--shiki-color-text)"> offset </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">try</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">for</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">chunkResult</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">of</span><span style="color: var(--shiki-color-text)"> stream) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">switch</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-constant)">chunkResult</span><span style="color: var(--shiki-color-text)">.type) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">case</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'metadata'</span><span style="color: var(--shiki-color-text)">:</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Stream started: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">chunkResult</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.fileSize</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> bytes`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-constant)">chunkResult</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.fileSize </span><span style="color: var(--shiki-token-keyword)">></span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0</span><span style="color: var(--shiki-color-text)">) {</span></span>
<span><span style="color: var(--shiki-color-text)"> reconstructedData </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Uint8Array</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-constant)">chunkResult</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">metadata</span><span style="color: var(--shiki-color-text)">.fileSize);</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">break</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">case</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'chunk'</span><span style="color: var(--shiki-color-text)">:</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">chunk</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Uint8Array</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-constant)">chunkResult</span><span style="color: var(--shiki-color-text)">.data);</span></span>
<span><span style="color: var(--shiki-color-text)"> totalBytes </span><span style="color: var(--shiki-token-keyword)">+=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">chunk</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">length</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-color-text)"> </span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (reconstructedData) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">reconstructedData</span><span style="color: var(--shiki-token-function)">.set</span><span style="color: var(--shiki-color-text)">(chunk</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> offset);</span></span>
<span><span style="color: var(--shiki-color-text)"> offset </span><span style="color: var(--shiki-token-keyword)">+=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">chunk</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">length</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">break</span><span style="color: var(--shiki-color-text)">;</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">case</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'complete'</span><span style="color: var(--shiki-color-text)">:</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Stream completed. Total: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">totalBytes</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)"> bytes`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">break</span><span style="color: var(--shiki-color-text)">;</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">} </span><span style="color: var(--shiki-token-keyword)">finally</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">stream</span><span style="color: var(--shiki-token-function)">.close</span><span style="color: var(--shiki-color-text)">();</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
The streaming API yields three types of results:
metadata
: First result containing file metadatachunk
: Each data chunk withdata
(ArrayBuffer) andposition
(number)complete
: Final result indicating stream completion
Delete Files
Delete a file attached to a record. This removes the file but does not delete the record itself.
<span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.delete</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId</span></span>
<span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
<span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"File deleted successfully"</span><span style="color: var(--shiki-color-text)">);</span></span>
<span></span>
Error Handling
All file operations throw TailorDBFileError
on failure. Use this for proper error handling and diagnostics.
<span><span style="color: var(--shiki-token-keyword)">try</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.upload</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fileContent</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> { contentType</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"text/plain"</span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> );</span></span>
<span><span style="color: var(--shiki-color-text)">} </span><span style="color: var(--shiki-token-keyword)">catch</span><span style="color: var(--shiki-color-text)"> (error) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (error </span><span style="color: var(--shiki-token-keyword)">instanceof</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">TailorDBFileError</span><span style="color: var(--shiki-color-text)">) {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.error</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`File error code: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">error</span><span style="color: var(--shiki-color-text)">.code</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.error</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Message: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-token-constant)">error</span><span style="color: var(--shiki-color-text)">.message</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> } </span><span style="color: var(--shiki-token-keyword)">else</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.error</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">`Unexpected error: </span><span style="color: var(--shiki-token-keyword)">${</span><span style="color: var(--shiki-color-text)">error</span><span style="color: var(--shiki-token-keyword)">}</span><span style="color: var(--shiki-token-string-expression)">`</span><span style="color: var(--shiki-color-text)">);</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
API Reference
File Metadata Properties
All file operations return or accept metadata with the following properties:
Property | Type | Description |
---|---|---|
contentType | string | MIME type of the file (e.g., "image/png", "text/plain") |
fileSize | number | Size of the file in bytes |
sha256sum | string | SHA-256 checksum of the file content |
lastUploadedAt | string | ISO 8601 timestamp of the last upload |
Method Signatures
<span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.upload</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> content: string </span><span style="color: var(--shiki-token-keyword)">|</span><span style="color: var(--shiki-color-text)"> Uint8Array</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> options: { contentType</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> string }</span></span>
<span><span style="color: var(--shiki-color-text)">): </span><span style="color: var(--shiki-token-constant)">Promise</span><span style="color: var(--shiki-token-keyword)"><</span><span style="color: var(--shiki-color-text)">{ metadata</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> FileMetadata }</span><span style="color: var(--shiki-token-keyword)">></span></span>
<span></span>
<span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.download</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId: string</span></span>
<span><span style="color: var(--shiki-color-text)">): </span><span style="color: var(--shiki-token-constant)">Promise</span><span style="color: var(--shiki-token-keyword)"><</span><span style="color: var(--shiki-color-text)">{ data</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> Uint8Array; metadata</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> FileMetadata }</span><span style="color: var(--shiki-token-keyword)">></span></span>
<span></span>
<span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.getMetadata</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId: string</span></span>
<span><span style="color: var(--shiki-color-text)">): </span><span style="color: var(--shiki-token-constant)">Promise</span><span style="color: var(--shiki-token-keyword)"><</span><span style="color: var(--shiki-color-text)">FileMetadata</span><span style="color: var(--shiki-token-keyword)">></span></span>
<span></span>
<span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.openDownloadStream</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId: string</span></span>
<span><span style="color: var(--shiki-color-text)">): </span><span style="color: var(--shiki-token-constant)">Promise</span><span style="color: var(--shiki-token-keyword)"><</span><span style="color: var(--shiki-color-text)">AsyncIterator</span><span style="color: var(--shiki-token-keyword)"><</span><span style="color: var(--shiki-color-text)">ChunkResult</span><span style="color: var(--shiki-token-keyword)">>></span></span>
<span></span>
<span><span style="color: var(--shiki-token-constant)">tailordb</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">file</span><span style="color: var(--shiki-token-function)">.delete</span><span style="color: var(--shiki-color-text)">(</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> typeName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> fieldName: string</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> recordId: string</span></span>
<span><span style="color: var(--shiki-color-text)">): </span><span style="color: var(--shiki-token-constant)">Promise</span><span style="color: var(--shiki-token-keyword)"><void></span></span>
<span></span>
See Also
- File Type documentation - For GraphQL operations, HTTP endpoints, and schema definitions
- TailorDB Schema - For defining File fields in your schema