Specify Postgres schema #2635
-
What do you want to change?I am interested to use multiple schemas in Postgres. This can for example be used to handle multiple tenants in a single database. Although it's possible to share tables across tenants, it can be better to use more than one schema instead. This isolates each tenant's data from the others. It also reduces the performance costs of each tenant's db load from impacting other tenants because tables hold fewer lines. Is there a way to use schemas via SQL statements in SQL? Eg What database engines need to be changed?PostgreSQL What programming language backends need to be changed?Go |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments 6 replies
-
Additionally, switching schemas would be a useful feature for integration tests that need to be isolated from each other. Creating temporary schemas, using them during a test run, then tearing them down afterwards is a useful technique to allow partitioning such that different tests don't interfere with each other. |
Beta Was this translation helpful? Give feedback.
-
BTW the current workaround is to set up each tenant to have its own default schema in Postgres (i.e. per user role), and then use a separate connection pool with the credentials for each tenant. This is clumsy and not ideal for the integration test use-casr. |
Beta Was this translation helpful? Give feedback.
-
Unfortunately there is no way to parameterize a schema name in a query (see this SO thread). But you can pass a schema name as a connection parameter, which will set the If you are trying to avoid separate connection pools per tenant, the only thing I can think of is to run In theory |
Beta Was this translation helpful? Give feedback.
-
When we've used this technique, we had to do a string replace on the queries, e.g.
This is reliable, although it seems a bit clumsy. I don't thing there's a reliable way to use the |
Beta Was this translation helpful? Give feedback.
Unfortunately there is no way to parameterize a schema name in a query (see this SO thread).
But you can pass a schema name as a connection parameter, which will set the
search_path
. So presuming you have some way of setting up a separate schema per tenant, you can scope access to that schema at the connection level.If you are trying to avoid separate connection pools per tenant, the only thing I can think of is to run
SET SCHEMA 'tenant_x_schema_name';
before every query. But I haven't actually tried that and it seems error prone. (EDIT: I don't think this is safe, see @rickb777's comment below.)In theory
sqlc
could probably generate code which does that (based on a configuration), but…