mongoengine соединение и несколько баз данных - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть 2 базы данных, из которых я хочу запросить, но я получаю результаты только из одной.Я использую mongoengine с питоном и графеном (это мой первый раз).Я исчерпал свой поиск, и я не понимаю, как я могу решить эту проблему.Вот мой код:

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)

Теперь, когда у меня запущен мой python-сервер, mongod работает, я могу нажать / workouts и он вернет нужный мне массив.Но / users не будут возвращать результаты.

Я не получаю ошибок, с моим запросом графена все в порядке.

Я могу заставить работать только один из запросов одновременно.

Я пытался использовать псевдоним, не закрывая соединения, объявляя соединение на верхнем уровне даже перед классом UserModel или Workout.

1 Ответ

0 голосов
/ 03 июня 2019

Если каждая ваша модель связана с другой базой данных.Вы должны использовать что-то вроде этого (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()
    ...
...