MongoKit проти MongoEngine проти Flask-MongoAlchemy для Flask [закрито]


75

Хтось має досвід роботи з MongoKit, MongoEngine або Flask-MongoAlchemy for Flask?

Який тобі більше подобається? Позитивний чи негативний досвід ?. Забагато варіантів для колби-новачка.


44
Здається, трохи жорстко закрити це запитання користувачів! Я знайшов це корисним.
RubyGladiator

1
так само, я теж знайшов це корисним.
Тім

Відмінна відповідь, я знайшов це корисним, впевнений, у інших є хороші ідеї - відкрити знову?
jowan sebastian

Хто міг би знову відкрити питання?, Це залежить від мене?
oscarmlage

чудове питання!
Анекдотін

Відповіді:


87

Я вклав багато часу, оцінюючи популярні ORM Python для MongoDB. Це була вичерпна вправа, оскільки я дуже хотів її вибрати.

Мій висновок полягає в тому, що ORM видаляє задоволення від MongoDB. Ніхто не відчуває себе природним, вони накладають обмеження, подібні до тих, які спочатку змусили мене відійти від реляційних баз даних.

Знову ж таки, я дуже хотів використовувати ORM, але тепер я переконаний, що використання pymongoбезпосередньо - це шлях. Тепер я дотримуюся шаблону, який охоплює MongoDB pymongo, і Python.

Ресурсно-орієнтована архітектура веде до цілком природних уявлень. Наприклад, візьмемо такий ресурс користувача:

from werkzeug.wrappers import Response
from werkzeug.exceptions import NotFound

Users = pymongo.Connection("localhost", 27017)["mydb"]["users"]


class User(Resource):

    def GET(self, request, username):
        spec = {
            "_id": username,
            "_meta.active": True
        }
        # this is a simple call to pymongo - really, do
        # we need anything else?
        doc = Users.find_one(spec)
        if not doc:
            return NotFound(username)
        payload, mimetype = representation(doc, request.accept)
        return Response(payload, mimetype=mimetype, status=200)

    def PUT(self, request, username):
        spec = {
            "_id": username,
            "_meta.active": True
        }
        operation = {
            "$set": request.json,
        }
        # this call to pymongo will return the updated document (implies safe=True)
        doc = Users.update(spec, operation, new=True)
        if not doc:
            return NotFound(username)
        payload, mimetype = representation(doc, request.accept)
        return Response(payload, mimetype=mimetype, status=200)

У Resourceбазовому класі виглядає як

class Resource(object):

    def GET(self, request, **kwargs):
        return NotImplemented()

    def HEAD(self, request, **kwargs):
        return NotImplemented()

    def POST(self, request, **kwargs):
        return NotImplemented()

    def DELETE(self, request, **kwargs):
        return NotImplemented()

    def PUT(self, request, **kwargs):
        return NotImplemented()

    def __call__(self, request, **kwargs):
        handler = getattr(self, request.method)
        return handler(request, **kwargs)

Зверніть увагу, що я використовую WSGIспецифікацію безпосередньо і використовую, Werkzeugде це можливо (до речі, я думаю, що це Flaskдодає зайвих ускладнень Werkzeug).

Функція representationбере Acceptзаголовки запиту та створює відповідне подання (наприклад,, application/jsonабо text/html). Це не складно здійснити. Він також додає Last-Modifiedзаголовок.

Звичайно, ваш внесок потрібно продезінфікувати, і код, як представлено, не буде працювати (я маю на увазі це як приклад, але не важко зрозуміти мою думку).

Знову ж таки, я спробував усе, але ця архітектура зробила мій код гнучким, простим і розширюваним.


11
+1. Вам не потрібен ORM на вершині Монго. Безпосереднє використання Pymongo дасть вам повну свободу.
содзін

Мені подобається ця відповідь, але я просто хочу зазначити, що в більшості випадків це не так просто, як просто повернути колекцію mongo безпосередньо лише тому, що найкраща практика в mongo - це скорочення назв полів ... особливо щось на зразок колекції користувача (якщо сайт має високий трафік) або аналітичні дані тощо. В основному, моє питання полягає в тому, як би Ви перетворили назви полів, якби вони були скорочені у Вашій програмі відпочинку? (тобто u -> ім'я користувача, e -> електронна пошта тощо для економії споживання диска та пам'яті)
Йорданія

1
@Arrieta Що ти думаєш про flask-pymongo? Здається, його можна було б використовувати із стильною колбою для досягнення майже того ж самого.
Кріс2048

@ Chris2048 Я творець Flask-Classy, ​​і ми поєднуємо ці два разом у нашому основному додатку на роботі саме для цієї мети.
apiguy

3
@tim Я не знаю, про що я думав, коли писав це три роки тому, але зараз я раджу, що ти використовуєш інструменти, бо знаєш, що це вирішує проблему, яку ти намагаєшся вирішити. Для більшості цілей надійна реляційна база даних, така як Postgres, вирішить усі ваші проблеми збереження, агрегування та аналізу даних, одночасно захищаючи ваші дані так, як ви ще цього не зрозуміли, оскільки ваше програмне забезпечення продовжує рости.
Конрад, Дін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.