mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 07:08:01 +00:00
59 lines
1.8 KiB
Markdown
59 lines
1.8 KiB
Markdown
# Create And Execute SQL Statements With \gexec
|
|
|
|
The [`\gexec`
|
|
meta-command](https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-META-COMMAND-GEXEC)
|
|
is a variation of the [`\g`
|
|
meta-command](https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-META-COMMAND-G),
|
|
both of which can be used in a `psql` session. Whereas the `\g` command sends
|
|
the current query in the buffer to the PostgreSQL server for execution, the
|
|
`\gexec` command first sends the query to the server for execution and then
|
|
executes each row of the result as its own SQL statement.
|
|
|
|
This is both a bit absurd and powerful. And a bit unnecessary considering all
|
|
of the scripting capabilities with anything from bash to any language with a
|
|
SQL client library.
|
|
|
|
Nevertheless, let's take a look at a contrived example of how it works. Here,
|
|
we have a SQL statement that does some string concatenation based off values in
|
|
an array. This results in three separate `create schema` statements.
|
|
|
|
```sql
|
|
> select
|
|
'create schema if not exists schema_' || letter || ';'
|
|
from unnest(array['a', 'b', 'c']) as letter
|
|
\gexec
|
|
|
|
CREATE SCHEMA
|
|
CREATE SCHEMA
|
|
CREATE SCHEMA
|
|
|
|
> \dn
|
|
List of schemas
|
|
Name | Owner
|
|
----------+-------------------
|
|
public | pg_database_owner
|
|
schema_a | postgres
|
|
schema_b | postgres
|
|
schema_c | postgres
|
|
(4 rows)
|
|
```
|
|
|
|
Three new schemas get created which we can inspect with `\dn`.
|
|
|
|
Notice, if we simply execute the primary statement, we can see the intermediate
|
|
result that `\gexec` will subsequently execute.
|
|
|
|
```sql
|
|
> select
|
|
'create schema if not exists schema_' || letter || ';'
|
|
from unnest(array['a', 'b', 'c']) as letter
|
|
\g
|
|
|
|
?column?
|
|
---------------------------------------
|
|
create schema if not exists schema_a;
|
|
create schema if not exists schema_b;
|
|
create schema if not exists schema_c;
|
|
(3 rows)
|
|
```
|