On Sun, Mar 27, 2022, at 2:56 PM, mkmo...@gmail.com wrote:
> Hi Mike,
> 
> I'm writing a library that uses SQLAlchemy. The user will pass the library an 
> update, and the library will add a RETURNING clause for postgresql users, and 
> then return the model back to the user. The idea here is to update and select 
> the row in a single database call, instead of the normal approach where two 
> calls are made.
> 
> However, `upd.returning(User)` will actually return a Core row, not the ORM 
> model instance:
> 
>     upd = update(User).values(name='foo').where(User.id == 1).returning(User)
>     result = session.execute(upd)
>     row = result.one()
>     assert isinstance(row, Row)
> 
> The key question I have is how to convert a Core row into an ORM model 
> instance.

use the construct select(User).from_statement(update(User)...returning()) .   
See the example at 
https://docs.sqlalchemy.org/en/14/orm/persistence_techniques.html#using-insert-update-and-on-conflict-i-e-upsert-to-return-orm-objects
 


> 
>      `model(**row._mapping)`  fails in at least these two cases: different 
> field name in ORM vs database, and column_property.
> 
> I also wonder, should SQLAlchemy return the Model instead of the core row in 
> this case?

unknown at this time.  The above link illustrates a very new technique by which 
this can work now.    if this were to become more implicit without the extra 
step, that would at best be a 2.1 thing not expected for at least 18 months, it 
would be based on general demand for this kind of thing (which does seem to be 
increasing).






> 
> -------
> 
> I've gotten this far:
> 
>     model = model_from_dml(upd)
>     upd = upd.returning(*select(model).selected_columns)   # this will apply 
> the column_property to the RETURNING
>     row = session.execute(upd).one()
> 
> Now I just need to take this row and convert it to an ORM object.
> 
> Is there a public API I can use to take a Core `row` and convert it to an ORM 
> model?
> 
> Thanks and best regards,
> 
> Matthew
> On Sunday, March 27, 2022 at 11:11:30 AM UTC-7 Mike Bayer wrote:
>> 
>> 
>> On Sun, Mar 27, 2022, at 2:08 PM, mkmo...@gmail.com wrote:
>>> Hi Mike,
>>> 
>>> Thanks. Should I use column_descriptions[0]['type'] ?
>> 
>> yup, that should be pretty consistent in this case.
>> 
>> I've implemented most of an actual feature for this but isn't committed yet 
>> at https://gerrit.sqlalchemy.org/c/sqlalchemy/sqlalchemy/+/3742
>> 
>>> 
>>> 
>>> In my case, `type`, `expr` and `entity` all return the model class that I 
>>> am interested in.
>>> 
>>> Thanks and best regards,
>>> 
>>> Matthew
>>> On Saturday, March 26, 2022 at 12:02:54 PM UTC-7 Mike Bayer wrote:
>>>> __
>>>> the Project model is actually in there, but not in a public API place 
>>>> (this is not the solution, but look inside of table._annotations to see 
>>>> it).
>>>> 
>>>> The closest public API we have for this very new API right now is the 
>>>> Query equivalent of column_descriptions, which is available on the 
>>>> select() construct and works when the thing being selected is ORM-enabled, 
>>>> and, alarmingly, it seems there is no documentation whatsoever for the 
>>>> Select version of it, that is wrong, but anyway see the 1.x docs for now: 
>>>> https://docs.sqlalchemy.org/en/14/orm/query.html#sqlalchemy.orm.Query.column_descriptions
>>>> 
>>>> This accessor would ideally be on insert, update and delete also, which it 
>>>> currently is not.  However, here's a quick way to get it right now:
>>>> 
>>>> class A(Base):
>>>>     __tablename__ = 'a'
>>>> 
>>>>     id = Column(Integer, primary_key=True)
>>>>     data = Column(String)
>>>> 
>>>> 
>>>> upd = update(A)
>>>> 
>>>> print(select(upd.table).column_descriptions)
>>>> 
>>>> i might take a crack at cleaning this up now but the above will get you 
>>>> what you need.
>>>> 
>>>> On Sat, Mar 26, 2022, at 1:34 PM, mkmo...@gmail.com wrote:
>>>>> Hello,
>>>>> 
>>>>> How can I infer the ORM model class from an update (or insert, or delete) 
>>>>> function result?
>>>>> 
>>>>> upd = update(Project).values(name='foo').where(
>>>>>     Project.id == 1
>>>>> )
>>>>> 
>>>>> def my_library_function(session, upd):
>>>>>     result = session.execute(upd)
>>>>>     # how to get the Project ORM model here, using only session and upd ?
>>>>> 
>>>>> I saw that the update() object has a `table` attribute, but this returns 
>>>>> the Core table (not the ORM model). In addition I don't have access to 
>>>>> the base/registry from this function (unless it can be derived from 
>>>>> session?). Moreover it seems like searching the registry is O(n) and will 
>>>>> not work in all cases, such as when two ORM models map to the same Core 
>>>>> table.
>>>>> 
>>>>> Thanks and best regards,
>>>>> 
>>>>> Matthew
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> 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/9fc63126-a36d-4e36-b4df-50701bfcae47n%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/sqlalchemy/9fc63126-a36d-4e36-b4df-50701bfcae47n%40googlegroups.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+...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/sqlalchemy/abc01658-17a5-451b-aca7-0864998c5af7n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/sqlalchemy/abc01658-17a5-451b-aca7-0864998c5af7n%40googlegroups.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/1ab4ec6a-aff6-4b7d-8835-6553a48a68b6n%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/sqlalchemy/1ab4ec6a-aff6-4b7d-8835-6553a48a68b6n%40googlegroups.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/a73e131f-e177-4a82-b8bb-9abf9f9f3e64%40www.fastmail.com.

Reply via email to