3

MongoEngine と Peewee のいずれかを DB バックエンドとして使用する次のコード例があります。

import mongoengine, peewee
from mongomodels import *
from mysqlmodels import *

class Parser(object):

    def __init__(self, line, dbBackend):
        if dbBackend in ["MongoDB","MySQL"]:
            self.line = line
            self.DB = dbBackend
            user = self.createUser()
            car = self.createCar(user)
            parking = self.createParking(car)
        else:
            raise Exception()

    def createUser(self):
        if self.DB == "MongoDB":
            newUserID = self._createMongoUser(self.line['firstname'], self.line['lastname'], '...')
        else:
            newUserID = self._createMySQLUser(self.line['firstname'], self.line['lastname'], '...')

        return newUserID

    def _createMongoUser(self, firstname, lastname, '...'):
        try:
            _user = MongoUserModel.objects.get(firstname=firstname, lastname=lastname)
        except mongoengine.errors.DoesNotExist as e:
            user = MongoUserModel(firstname=firstname, password)
            _user = user.save()
        finally:
            return _user



    def _createMySQLUser(self, firstname, lastname, '...'):
        try:
            _user = MySQLUserModel.get(MySQLUserModel.fistname == firstname, MySQLUserModel.lastname == lastname )
        except Exception as e:
            user = MySQLUserModel(fistname=fistname, lastname=lastname)
            _user = user.save()
        finally:
            return _user


    def createCar(self, user):
        pass

    def createParking(self, car):
        pass

コードを DRY に保ち、モデルを作成するための 2 つのメソッドを再定義しないようにするための適切なプラクティス / トリック / モジュールはありますか?

PHP の PDO と同じように、新しい抽象化クラス 'UserModel' を作成できますか?

4

1 に答える 1

1

これは私が最近経験したことです - 私はmongoバックエンドからpostgresに交換しました。元のプロジェクトをセットアップしたとき、いくつかのモデルと DataLayer がありました。データレイヤー (dl) には、アプリ全体で使用する非常に単純なインターフェイスがありました。

# note: this is half python / half pseudocode

class Model1(object):
    __collection__ = 'model1'
    __tablename__ = 'model1'
    # field definitions etc


class MongoDataLayer(object):
    def __init__(self, mongo_db_connection):
        self.conn = mongo_db_connection

    def load(self, model, conditions):
        raw = self.conn[model.__collection__].find(...)
        return model(**raw)

    def persist(self, obj):
        self.conn[obj.__collection__].save(obj.as_dict())


class SQLDataLayer(object):
    def __init__(self, sa_session_factory):
        self.Session = sa_session_factory
        self.session = self.Session()

    def load(self, model, conditions):
        return self.session.query(model).find_by(conditions).one() # ...etc

    def persist(self, obj):
        self.conn[obj.__collection__].save(obj)

# connections - mongo and postgres (I use SQLAlchemy)
dl_mongo = MongoDataLayer(db...)
dl_sql = SQLDataLayer(Session...)

# using them - you don't care which one you have
m = dl_mongo.load(models.Model1)
dl_mongo.persist(m)

m = dl_sql.load(models.Model1)
dl_sql.persist(m)

私のアプリでは、初期ロードで dl をロードし、データ アクセスが必要になるたびにそれをアプリに挿入します。アプリ自体はモデルを認識しますが、モデルをロード/保存する方法の詳細は認識しません。

最善の方法ではないかもしれませんが、私にとってはうまくいきました。他の人がそれに対処する方法を聞くことに興味があります。

于 2013-10-10T09:55:13.967 に答える