I use pyramid as a web framework, and when I create the DB session for each request, I add a reference to the current request object to the DB session. The session object has an "info" attribute which is intended for application-specific things like this:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.info Then, in the before_flush event handler, I retrieve the request object from session.info, and then I can add whatever request-specific info I want to the DB. Simon On Sun, Mar 14, 2021 at 4:05 PM JPLaverdure <jp.laverd...@gmail.com> wrote: > > Hi Elmer, > > Thanks for your reply ! > My issue is not with obtaining the info I want to inject (the logged in > users's email), I already have that all ready to go :) > > My whole database is versioned using the history_meta.py example from > SQLAlchemy > https://docs.sqlalchemy.org/en/13/_modules/examples/versioned_history/history_meta.html > > I was hoping for a simple way to inject the user info into the _history row > creation steps. > > The SQLAlchemy example makes use of this event listener: > > def versioned_session(session): > > @event.listens_for(session, "before_flush") > def before_flush(session, flush_context, instances): > for obj in versioned_objects(session.dirty): > create_version(obj, session) > for obj in versioned_objects(session.deleted): > create_version(obj, session, deleted=True) > > So I'm tempted to follow the same strategy and just override this listener to > supplement it with the user info but I'm wondering how to pass in non > SQLAlchemy info into its execution context... > > So basically, I have the info I want to inject, I'm just not sure how to pass > it to SQLAlchemy > > Thanks, > > JP > > On Friday, March 12, 2021 at 6:55:19 p.m. UTC-5 elmer....@gmail.com wrote: >> >> Hi JP, >> >> Depending on how you've implemented your history tracking, that routine is >> quite far removed from your web framework and getting a neat, clean way of >> dealing with that might not be within reach. >> >> However, most web frameworks have some concept of a threadlocal request (or >> function to retrieve it), which you could invoke and if such a request >> exists, you could use that to load whatever user identity you have available >> on there (again, the details differ, but this tends to be a shared feature). >> From there you can store the user either as a foreign key, or a unique >> identifier like email. Which one you pick would depend on how you want the >> history to be affected when you delete a user record for example. >> >> >> >> On Fri, Mar 12, 2021 at 11:58 PM JPLaverdure <jp.lav...@gmail.com> wrote: >>> >>> Hello everyone, >>> >>> We already have the ability to timestamp the creation of the history row, >>> but it would also be interesting to be able to track the user responsible >>> for the content update. >>> I would like to get suggestions on the best way to achieve this. >>> >>> I realize this is somewhat outside the scope of sqlalchemy as the notion of >>> a "logged in user" is more closely related to the context of the app/webapp >>> using SQLAlchemy as its ORM but maybe other people would benefit from >>> having a way to inject arbitrary data in the history table. >>> >>> Ideally, I would like the insert in the _history table to be atomic, so I >>> feel like hooking an update statement to an event might not be the way to >>> go. >>> I'm tempted to modify the signature of before_flush but I'm not sure where >>> it gets called. >>> >>> Any help is welcome ! >>> Thanks >>> >>> JP >>> >>> -- >>> 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+...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/sqlalchemy/82a24998-14e1-4ff4-a725-dd25c20a8bf2n%40googlegroups.com. >> >> >> >> -- >> >> Elmer > > -- > 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/58bb6713-18f4-4d69-8d7b-a27772711bd5n%40googlegroups.com. -- 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/CAFHwexcy12htOqEeJGeGf%3D-oxm7ynRbnmFV8AvgW0QusZoJ8hA%40mail.gmail.com.