BeanieODM/beanie

ClientSession Type mismatch

QSHolzner opened this issue · 5 comments

ClienSession type error
Since the update to motor 3.3 I get type errors. In motor 3.3 additional type hints have been added to the public API.
The type returned by AsyncIOMotorClient start_session() is AsyncIOMotorClientSession or AgnosticClientSession.
The find_one function of beanie Document expects a ClientSession for the session parameter.
I think the parameter type should be changed to AsyncIOMotorClientSession.

The AsyncIOMotorClientSession is a Container for the encapsulated PyMongo ClientSession. When motor then executes Db actions the ClientSession contained in the AsyncIOMotorClientSession is extracted and passed to PyMongo.

I hope in the following example this becomes clear.

With the assignment session=s the following error message comes:
An argument of type "AgnosticClientSession" cannot be assigned to the parameter "session" of type "ClientSession | None" in the function "find_one".

import asyncio
from typing import Optional

from beanie import Document, init_beanie
from motor.motor_asyncio import AsyncIOMotorClient


class Product(Document):
    name: str
    description: Optional[str] = None
    price: float


async def example():
    # Beanie uses Motor async client under the hood
    client = AsyncIOMotorClient(
        "mongodb://localhost:27017",
        directConnection=True,
    )

    await init_beanie(database=client.mydb, document_models=[Product])
    async with await client.start_session() as s:  # s is of type AgnosticClientSession
        async with s.start_transaction():
	    # find_one expects session of type CientSession
            product: Product | None = await Product.find_one(
                Product.price < 10, session=s
            )
            if product:
                print(product.name)


if __name__ == "__main__":
    asyncio.run(example())

Hi! Thank you for the catch. I'll check and fix it this/next week.

Hi @QSHolzner ,
Unfortunately, I can not reproduce it. Could you please provide you system version, beanie version and other nessasary details to me be able to reproduce correctly.
I use Ubuntu 22.04, beanie 1.23.6

Hi Roman,
sorry I think I missed some context in the description.
There is no runtime error in this example. I get the type error in VSCode from the pylance plugin.
Pylance uses pyright for type checking. If I start pyright from command-line I get the following message:

/workspaces/api-server/scripts/beanie_demo.py:26:45 - error: Argument of type "AgnosticClientSession" cannot be assigned to parameter "session" of type "ClientSession | None" in function "find_one" Type "AgnosticClientSession" cannot be assigned to type "ClientSession | None" "AgnosticClientSession" is incompatible with "ClientSession" "AgnosticClientSession" is incompatible with "None" (reportGeneralTypeIssues)

Used Versions:
beanie==1.23.6
motor==3.3.2

Hope this helps.
Thank you

This issue is stale because it has been open 30 days with no activity.

This issue was closed because it has been stalled for 14 days with no activity.