On Mon, Mar 1, 2021, at 9:45 AM, Ahmed wrote:
>> 
> I'm not authorized to talk on behalf of F-S but IMO, these options could be 
> milestones applied in parallel toward migration to 2.0. However, a question 
> arises here, that you might have already seen, which is: given the major leap 
> in how SQLAlchemy 2.0 is designed, is it better to think of rebuilding 
> medium+ projects for 2.0 while maintaining existing codebases for 1.3? In 
> other words, how much will 2.0 be backward compatible with 1.3?

I'm hoping this is thoroughly addressed in the new documentation in particular 
https://docs.sqlalchemy.org/en/14/changelog/migration_14.html and 
https://docs.sqlalchemy.org/en/14/changelog/migration_20.html 





> 
>  A. 
> 
> On Fri, Feb 26, 2021, 5:18 PM Mike Bayer <mike...@zzzcomputing.com> wrote:
>> __
>> 
>> 
>> On Fri, Feb 26, 2021, at 8:04 AM, Ahmed wrote:
>>> Hi Mike - Thank you for your insights. Actually, this is part of upgrading 
>>> Flask-SQLAlchemy library dependency to 1.4.0b3 and eventually 2.0. The 
>>> snippet above is extracted from a test case that didn't pass against 
>>> 1.4.0b3.
>>> 
>>> I've checked sqlalchemy.orm.with_parent 
>>> <https://docs.sqlalchemy.org/en/14/orm/query.html?highlight=with_parent#sqlalchemy.orm.with_parent>
>>>  (Python function, in Query API) documentation entry, however, it's not 
>>> clear to me how with_parent construct can fit in the implementation instead 
>>> of Query. I guess it would require a major change in how the library 
>>> (Flask-SQLAlchemy) is currently designed as it functionally extends 
>>> sqlalchemy.orm.Query and pass the extended class to relationship and other 
>>> constructs as well.
>> 
>> yes so, SQLAlchemy 2.0's approach is frankly at odds with the spirit of 
>> Flask-SQLAlchemy.    The Query and "dynamic" loaders are staying around 
>> largely so that Flask can come on board, however the patterns in F-S are 
>> pretty much the ones I want to get away from.
>> 
>> 2.0's spirit is one where the act of creating a SELECT statement is a 
>> standalone thing that is separate from being attached to any specific class 
>> (really all of SQLAlchemy was like this, but F-S has everyone doing the 
>> Model.query thing that I've always found to be more misleading than 
>> helpful), but SELECT statements are now also disconnected from any kind of 
>> "engine" or "Session" when constructed.    
>> 
>> as for with_parent(), with_parent is what the dynamic loader actually uses 
>> to create the query.  so this is a matter of code organization.
>> 
>> F-S would have you say:
>> 
>> user = User.query.filter_by(name='name').first()
>> address = user.addresses.filter_by(email='email').first()
>> 
>> noting above, there's no "Session" anywhere.  where is it?   Here's a Hacker 
>> News comment lamenting the real world implications of this: 
>> https://news.ycombinator.com/item?id=26183936  
>> 
>> SQLAlchemy 2.0 would have you say instead:
>> 
>> with Session(engine) as session:
>>     user = session.execute(
>>           select(User).filter_by(name='name')
>>     ).scalars().first()
>>    
>>    address = session.execute(
>>        select(Address).where(with_parent(user, 
>> Address.user)).filter_by(email='email')
>>    ).scalars().first()
>> 
>> Noting above, a web framework integration may still wish to provide the 
>> "session" to data-oriented methods and manage its scope, but IMO it should 
>> be an explicit object passed around.  The database connection / transaction 
>> shouldn't be made to appear to be inside the ORM model object, since that's 
>> not what's actually going on.
>> 
>> If you look at any commentary anywhere about SQLAlchemy, the top complaints 
>> are:
>> 
>> 1. too magical, too implicit
>> 
>> 2. what's wrong with just writing SQL?
>> 
>> SQLAlchemy 2.0 seeks to streamline the act of ORMing such that the user *is* 
>> writing SQL, they're running it into an execute() method, and they are 
>> managing the scope of connectivity and transactions in an obvious way.   
>> People don't necessarily want bloat and verbosity but they do want to see 
>> explicitness when the computer is being told to do something, especially 
>> running a SQL query.  We're trying to hit that balance as closely as 
>> possible.
>> 
>> The above style also has in mind compatibility with asyncio, which we now 
>> support.  With asyncio, it's very important that the boundary where IO 
>> occurs is very obvious.  Hence the Session.execute() method now becomes the 
>> place where users have to "yield".  With the older Query interface, the 
>> "yields" would be all over the place and kind of arbirary, since some Query 
>> methods decide to execute at one point or another.   
>> 
>> Flask-SQLAlchemy therefore has to decide where it wants to go with this 
>> direction, and there are options, including sticking with the legacy query / 
>> dynamic loader, perhaps vendoring a new interface that behaves in the 
>> flask-sqlalchemy style but uses 2.0-style patterns under the hood, or it can 
>> go along with the 2.0 model for future releases.       From SQLAlchemy's 
>> point of view, the Query was always not well thought out and was 
>> inconsistent with how Core worked, and I've wanted for years to resolve that 
>> problem.
>> 
>> - mike
>> 
>> 
>> 
>> 
>>> On Thursday, February 25, 2021 at 2:21:43 PM UTC-8 Mike Bayer wrote:
>>>> __
>>>> this will be fixed in https://github.com/sqlalchemy/sqlalchemy/issues/5981 
>>>>  where I've reverted entirely some changes to AppenderQuery that made it 
>>>> work more in 2.0 style.  As Query is going to be present in 2.0, "dynamic" 
>>>> relationships will remain also as legacy.   They are superseded by 
>>>> explicit use of the with_parent() filtering construct.
>>>> 
>>>> 
>>>> 
>>>> On Thu, Feb 25, 2021, at 3:25 PM, Ahmed wrote:
>>>>> Hello,
>>>>> 
>>>>> It seems that SQLAlchemy 1.4.0b3 ignores relationship()  query_class 
>>>>> parameter. Here's the snippet that works with 1.3 but doesn't with 1.4:
>>>>> 
>>>>> class Parent(db.Model):
>>>>>     __tablename__ = "todo"
>>>>>     id = db.Column(db.Integer, primary_key=True)
>>>>>     # ... Column mappings
>>>>>     children = db.relationship("Child", backref="todo", 
>>>>> query_class=DerivedQuery, lazy="dynamic")
>>>>> 
>>>>> class Child(db.Model):
>>>>>     __tablename__ = "todo"
>>>>>     # ... Column mappings
>>>>>     parent_id = db.Column(db.Integer, db.ForeignKey("todo.id"))
>>>>> 
>>>>> assert isinstance(p.children, DerivedQuery)
>>>>> 
>>>>> In 1.4, children attribute is always an instance of AppenderQuery 
>>>>> regardless of the query_class value. I might have missed something above 
>>>>> though.
>>>>> 
>>>>> 
>>>>> 

>>>>> -- 
>>>>> 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/4454277c-b3a1-484e-b0e5-aef3e72eeb01n%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/sqlalchemy/4454277c-b3a1-484e-b0e5-aef3e72eeb01n%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/087934f8-d7fb-4062-8b2a-9d623a2e7941n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/sqlalchemy/087934f8-d7fb-4062-8b2a-9d623a2e7941n%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/f161e6b7-b8b1-457c-bd96-b4e2494b52f8%40www.fastmail.com
>>  
>> <https://groups.google.com/d/msgid/sqlalchemy/f161e6b7-b8b1-457c-bd96-b4e2494b52f8%40www.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/CAKwjfOB%2BeToncrsTp7AC8%2Bfa5T-bdDuq%2Bbia81_A9YM1Lp10cw%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/sqlalchemy/CAKwjfOB%2BeToncrsTp7AC8%2Bfa5T-bdDuq%2Bbia81_A9YM1Lp10cw%40mail.gmail.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/091e82f7-a814-4b9d-845d-7609c8bd917f%40www.fastmail.com.

Reply via email to