Thanks Mike! That’s a great idea. Yes indeed, that helps a lot. I really 
appreciate it.

Thanks again!

> On Feb 26, 2023, at 11:53 PM, Mike Bayer 
> <mike_not_on_goo...@zzzcomputing.com> wrote:
> 
> I think you should use a single master login for create_engine() so that the 
> pool deals with connections only at that top role.
> 
> Then when you **use** connections, use PostgreSQL SET ROLE: 
> https://www.postgresql.org/docs/current/sql-set-role.html 
> <https://www.postgresql.org/docs/current/sql-set-role.html> to set the 
> current role on the connection / session you are using, and RESET ROLE to 
> turn it back before connections are returned to the pool.
> 
> When you start a request, set the role:
> 
> await session.connection().exec_driver_sql("SET ROLE current_user")
> 
> Then, assuming you are using SET ROLE and not SET LOCAL ROLE, you want to 
> reset this role upon return to the pool.  Establish a pool return handler 
> that calls RESET ROLE using the "checkin" event: 
> https://docs.sqlalchemy.org/en/20/core/events.html#sqlalchemy.events.PoolEvents.checkin
>  
> <https://docs.sqlalchemy.org/en/20/core/events.html#sqlalchemy.events.PoolEvents.checkin>
>  
> 
> @event.listens_for(engine, "checkin")
> def receive_checkin(dbapi_connection, connection_record):
>     cursor = dbapi_connection.cursor()
>     cursor.execute("RESET ROLE")
>     cursor.close()
> 
> 
> 
> hope this helps
> 
> 
> 
> 
> 
> 
> On Sun, Feb 26, 2023, at 11:10 PM, Nate J wrote:
>> Hi List,
>> 
>> I have no Google-fu. This is especially obvious when trying to search for 
>> something like I’m asking about.
>> 
>> Does anyone have any info or links to docs, blog posts, etc. that covers how 
>> to use connection pools with individual PostgreSQL user logins for a backend 
>> REST API?
>> 
>> The reason I ask is I’m using row level security (RLS) like in the example 
>> below from the PostgreSQL docs. I’ve only ever used a single 
>> application-specific account for accessing the database for all tenants. 
>> Now, however, each API key used in an API request will be tied to an account 
>> table and will have a PostgreSQL database user created for them so 
>> “current_user” works for RLS.
>> 
>> I’d like for requests to complete as fast as possible and I’m guessing 
>> there’s a better way than logging in to the database for each request.
>> 
>> The software involved is PostgreSQL 14, SQLAlchemy with asyncpg and FastAPI.
>> 
>> From the page: https://www.postgresql.org/docs/current/ddl-rowsecurity.html 
>> <https://www.postgresql.org/docs/current/ddl-rowsecurity.html>
>> 
>> One example uses the DDL and policy:
>> 
>> CREATE TABLE accounts (manager text, company text, contact_email text);
>> 
>> ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
>> 
>> CREATE POLICY account_managers ON accounts TO managers
>>     USING (manager = current_user);
>> 
>> Thanks for your help.
>> 
>> 
>> -- 
>> SQLAlchemy - 
>> The Python SQL Toolkit and Object Relational Mapper
>>  
>> http://www.sqlalchemy.org/ <http://www.sqlalchemy.org/>
>>  
>> To post example code, please provide an MCVE: Minimal, Complete, and 
>> Verifiable Example. See http://stackoverflow.com/help/mcve 
>> <http://stackoverflow.com/help/mcve> for a full description.
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "sqlalchemy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to sqlalchemy+unsubscr...@googlegroups.com 
>> <mailto:sqlalchemy+unsubscr...@googlegroups.com>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/sqlalchemy/DCF5536D-71FD-46BA-B831-0755588A79DD%40gmail.com
>>  
>> <https://groups.google.com/d/msgid/sqlalchemy/DCF5536D-71FD-46BA-B831-0755588A79DD%40gmail.com?utm_medium=email&utm_source=footer>.
> 
> 
> -- 
> SQLAlchemy - 
> The Python SQL Toolkit and Object Relational Mapper
>  
> http://www.sqlalchemy.org/ <http://www.sqlalchemy.org/>
>  
> To post example code, please provide an MCVE: Minimal, Complete, and 
> Verifiable Example. See http://stackoverflow.com/help/mcve 
> <http://stackoverflow.com/help/mcve> for a full description.
> --- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+unsubscr...@googlegroups.com 
> <mailto:sqlalchemy+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sqlalchemy/b0a3a566-4e69-42d0-a24a-d8139dff950d%40app.fastmail.com
>  
> <https://groups.google.com/d/msgid/sqlalchemy/b0a3a566-4e69-42d0-a24a-d8139dff950d%40app.fastmail.com?utm_medium=email&utm_source=footer>.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/30CACE00-92BC-47D9-A4E3-B9CB0454C468%40gmail.com.

Reply via email to