Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mongoengine connection and multiple databases

I have 2 databases I want to query from, but I only get results from one. I'm using mongoengine with python and graphene (it's my first time). I've exhausted my search and I don't understand how I can resolve this issue. Here is my code:

import graphene
from mongoengine import Document, connect
from mongoengine.context_managers import switch_collection
from mongoengine.fields import (
    StringField,
    UUIDField,
    IntField,
    FloatField,
    BooleanField,
)
from graphene_mongo import MongoengineObjectType
from mongoengine.connection import disconnect


class UserModel(Document):
    meta = {"collection": "users"}

    userID = UUIDField()
    first_name = StringField()
    last_name = StringField()


class Users(MongoengineObjectType):
    class Meta:
        model = UserModel


class UsersQuery(graphene.ObjectType):
    users = graphene.List(Users)
    user = graphene.Field(Users, userID=graphene.UUID())

    def resolve_users(self, info):
        db = connect("users")
        users = list(UserModel.objects.all())
        db.close()
        return users

    def resolve_user(self, info, userID):
        return UserModel.objects(userID=userID).first()


users_schema = graphene.Schema(query=UsersQuery)
import graphene
from mongoengine import Document, connect
from mongoengine.fields import StringField, UUIDField
from graphene_mongo import MongoengineObjectType
from mongoengine.connection import disconnect


class Workout(Document):
    meta = {"collection": "workouts"}

    workoutID = UUIDField()
    workout_label = StringField()


class Workouts(MongoengineObjectType):
    class Meta:
        model = Workout


class Query(graphene.ObjectType):
    workouts = graphene.List(Workouts)
    workout = graphene.Field(Workouts, workoutID=graphene.UUID())

    def resolve_workouts(self, info):
        db = connect("workouts")
        wks = list(Workout.objects.all())
        db.close()
        return wks

    def resolve_workout(self, info, workoutID):
        return Workout.objects(workoutID=workoutID).first()


workouts_schema = graphene.Schema(query=Query)

Now when I have my python server up, mongod running I can hit the /workouts and it will return the array I need. But /users will not return the results.

I get no errors, nothing is wrong with my graphene query.

I can only get one of the queries to work at once.

I have tried using alias, not closing the connections, declaring the connect at the top level even before class UserModel or Workout.

like image 991
msha Avatar asked Mar 05 '23 04:03

msha


1 Answers

If each of your model is bound to a different database. You should use something like this (cfr docs):

connect('workouts', alias='dbworkouts')  # init a connection to database named "workouts" and register it under alias "dbworkouts"
connect('users', alias='dbusers')    

class Workout(Document):
    meta = {"db_alias": "dbworkouts"}
    workoutID = UUIDField()
    ...

class UserModel(Document):
    meta = {"db_alias": "dbusers"}
    userID = UUIDField()
    ...
like image 110
bagerard Avatar answered Mar 17 '23 12:03

bagerard