2013-10-10 2 views
3

DB 백엔드로 MongoEngine 및 Peewee를 사용하는 다음 예제 코드가 있습니다.두 데이터베이스 백엔드를 지원하고 내 코드를 DRY 상태로 유지하는 가장 비범 한 방법/트릭은 무엇입니까?

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를 유지하고 내 모델을 만드는 두 가지 방법을 재정의하지 않으려면 모범 사례/트릭/모듈이 있습니까?

PHP에서 PDO처럼 새로운 추상화 클래스 'UserModel'을 만들 수 있습니까?

+0

부끄러움이 주위에 더 이상 토론이 없습니다. 흥미로운 질문입니다. –

답변

1

이것은 내가 최근에 겪은 일입니다. 나는 몽고 백엔드에서 포스트 그레스로 바꿨습니다. 원래 프로젝트를 설정할 때 일부 모델과 DataLayer가있었습니다. 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을로드 한 다음 데이터 액세스가 필요할 때마다 앱에 주입합니다. 응용 프로그램 자체는 모델에 대해서만 알고 있지만로드/저장 방법에 대한 세부 정보는 아닙니다.

어쩌면 최선의 방법은 아니지만 나에게 도움이 될 수 있습니다. 다른 사람들이 어떻게 대처하는지 듣고 싶습니다.