On Mon, Jan 24, 2022, at 11:32 PM, jens.t...@gmail.com wrote:
> Mike, thank you for elaborating, that helps a lot! Yes, I meant a transient 
> or pending 
> <https://docs.sqlalchemy.org/en/14/orm/session_state_management.html#quickie-intro-to-object-states>
>  object above, you’re correct.
> 
> To make sure I understand correctly: it’s ok to declare
> 
>     deleted_at: Mapped[Optional[datetime.datetime]] = 
> Column(sqlalchemy.DateTime, nullable=True)
> 
>  or 
> 
>     id: Mapped[uuid.UUID] = 
> Column(sqlalchemy.dialects.postgresql.UUID(as_uuid=True), primary_key=True, 
> default=uuid.uuid4)
> 
> 
> where the RHS declares the column’s type by means of a SQLA type and the 
> LHS’s type a “*mapped”* stdlib Python type? 

yes, the above syntax is what you can use specifically when the sqlalchemy mypy 
plugin is installed, because it will sneak inside the mypy state and hide those 
"Column" objects from causing typing errors.

if you aren't using the plugin, then the above won't work.   I'm working on a 
new version of declarative that changes the above slightly so that you can do 
something basically exactly the same as the above (in a structural sense, 
there's a bit of an in-place naming change) without having to use a mypy plugin.


> It works here because the column’s type actually is implemented by means of 
> the LHS stdlib type. I also noticed that I can omit e.g. Mapped[uuid.UUID] 
> and in some cases mypy is still able to infer the correct type.

In this case, SQLAlchemy's mypy plugin does the inference in this case based on 
hardcoded rules that inspect the Column objects.   


> 
> Much thanks,
> Jens
> 
>  
> On Monday, January 17, 2022 at 1:04:46 AM UTC+10 Mike Bayer wrote:
>> 
>> 
>> On Sat, Jan 15, 2022, at 3:34 PM, jens.t...@gmail.com wrote:
>>> Hello Mike,
>>> 
>>> Yes that’s using the plugin: 
>>> sqlalchemy[mypy,postgresql_psycopg2binary]==1.4.29 I changed the function 
>>> declaration to this:
>>> 
>>>     @staticmethod
>>>     def create(dbsession: Session, name: str, id_: typing.Union[uuid.UUID, 
>>> sqlalchemy.dialects.postgresql.base.UUID] = None):
>>> 
>>> and it seems to work. In a similar vain, how do I manage the types of 
>>> mapped and unmapped objects? Following the above example:
>>> 
>>> user = User(dbsession, "Joe Black")
>>> 
>>> returns an unmapped, simple User object. Now suppose I have another 
>>> existing, mapped User object and would like to assign that  newly created 
>>> unmapped user:
>>> 
>>> other_user.spouse = user
>>> 
>>> which creates the following error:
>>> 
>>> error: Argument "spouse" to "User" has incompatible type "User"; expected 
>>> "Mapped[Any]"  [arg-type]
>> 
>> if the User class is unmapped, you wouldn't be assigning it to a 
>> relationship attribute like that.
>> 
>> I think what you might mean is that you have a User object that is what we 
>> call "transient", meaning, it's not yet persisted with any Session.   
>> 
>> again, you would want to set up the relationship attribute with a more 
>> specific annotation:
>> 
>> class User(...):
>>     # ...
>>     spouse: Mapped[User] = relationship("User", ...)
>> 
>> 
>> background on this in terms of the plugin is at 
>> https://docs.sqlalchemy.org/en/14/orm/extensions/mypy.html#mapping-relationships
>>  
>> 
>> 
>>> Declaring that column with:
>>> 
>>> spouse: typing.Union[Mapped[User], User] = relationship("User", 
>>> back_populates="spouse", uselist=False)
>>> seems to work; I just want to make sure that that’s a recommended way of 
>>> going about this? Should I always declare a type as a Union between a 
>>> mapped and unmapped same class?
>> 
>> no that's not correct.   The User class is "mapped" at the class level.   
>> you would only need one directive or the other (one of Mapped[User] or User) 
>> when using the Mypy plugin.
>> 
>> 
>> 
>> 
>> 
>>> 
>>> 
>>> Other than following the migration guide 
>>> <https://docs.sqlalchemy.org/en/14/changelog/migration_20.html>, I haven’t 
>>> looked into SQLA2 <https://github.com/sqlalchemy/sqlalchemy/projects/3>.
>>> Jens
>>> 
>>> 
>>> On Thursday, January 13, 2022 at 11:52:18 PM UTC+10 Mike Bayer wrote:
>>>> __
>>>> is this with the SQLAlchemy Mypy plugin?   current status is for 2.0 we 
>>>> are looking to move away from the plugin model and pretty much change how 
>>>> these things work.    Otherwise  if this is with the plugin, you would use 
>>>> "id: Mapped[uuid.UUID] = ..."
>>> 
>>> 
>>> -- 
>>> 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/5ccd954f-277f-4f4e-adc1-2d7a906b9c09n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/sqlalchemy/5ccd954f-277f-4f4e-adc1-2d7a906b9c09n%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/8e5d65eb-9fde-4ae9-8425-96c09230e389n%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/sqlalchemy/8e5d65eb-9fde-4ae9-8425-96c09230e389n%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/55773e9f-f7f6-484e-88aa-a85ef665a277%40www.fastmail.com.

Reply via email to