es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo pasar la sesión de la base de datos a Ariadne en Fastapi.

Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown

Soy nuevo en Python, intentando aprender y usar Fastapi, Ariadne y SQLAlchemy. Estoy siguiendo la documentación y estoy atascado.

Tengo mi inyección de dependencia get_db() para solicitudes REST normales, que proporciona un objeto Session, que paso por algunos módulos diferentes desde el inicio de la solicitud hasta que realmente hago el trabajo de la base de datos, y honestamente no entiendo este diseño. Pero lo dejé allí.

Luego, surgió otro problema. ¿Cómo puedo pasar db a Ariadne GraphQL? ¿Debo usar context_value o existen otras opciones?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Si ya ha creado una función de inyección de dependencias get_db() que proporciona un objeto Session para solicitudes REST normales, también puede usarlo para pasar el objeto Session a Ariadne GraphQL.

    Para lograr esto, simplemente puede usar el argumento context_value de la función make_executable_schema de Ariadne GraphQL que le permite definir un valor personalizado que se pasa a través del proceso de ejecución de la operación.

    Por ejemplo:

    from ariadne import QueryType, make_executable_schema
    from fastapi import FastAPI, Depends
    
    app = FastAPI()
    
    # Defina un QueryType para el esquema de Ariadne
    query = QueryType()
    
    # Defina una función de inyección de dependencias para el objeto Session
    def get_db():
        db = ...
        try:
            yield db
        finally:
            db.close()
    
    # Defina una función de resolución que use db desde el contexto
    @query.field("get_users")
    def resolve_get_users(parent, info):
        db = info.context["db"]
        users = db.query(...)
        return users
    
    # cree el esquema de Ariadne con la función make_executable_schema
    schema = make_executable_schema(type_defs, query)
    
    
    # Defina un punto final de GraphQL
    @app.post("/graphql")
    async def graphql(request: Request, query: GraphQLQuery = Body(...), db: Session = Depends(get_db)):
        response = await GraphQLResponse(
            schema.execute(
                query.query,
                variable_values=query.variables,
                operation_name=query.operationName,
                context_value={"db": db},
            ),
            status_code=200,
        )
        return response
    

    En el código anterior, el punto final graphql utiliza la función get_db() como inyección de dependencias para proporcionar un objeto Session para Ariadne GraphQL. Luego, se utiliza el argumento context_value de la función make_executable_schema para pasar el objeto db como parte del contexto al esquema de Ariadne.

    Después de eso, puede acceder al objeto db desde el contexto en sus funciones de resolución usando info.context["db"].

Comments are closed.