2012-07-25 4 views
7

웹 응용 프로그램이 아닌 프로젝트에서 SQLAlchemy를 사용하고 있습니다. 데이터베이스에서 여러 오브젝트를로드하고 로컬로 수정하지만 커미트가 _ 행될 때마다 데이터베이스에 이러한 갱신 사항을 저장하지 않으려는 서 v 응용 프로그램입니다. 나는 이전에 Django ORM과 함께 일부 웹 프로젝트를 진행해 왔으며 달성하려는 대상에 더 잘 어울리는 것으로 나타났습니다. Django ORM에서는 저장하고 싶지 않은 다른 것들을 저장하지 않고 싶을 때마다 각 객체를 저장할 수있었습니다. SQLAlchemy에서 왜 이렇게 작동하는지 알지만, 어떻게 장고와 같은 방식으로이 작업을 수행 할 수 있을지 궁금합니다.SQLAlchemy에서 커밋 개체 변경 사용 안 함


업데이트 : , 그것은 쉽게 내가 달성하기 위해 노력하고있어 이해할 수 있도록하기 위해 내가 당신에게 예를 제공합니다.

이 실제로 어떻게 작동 :

a = MyModel.query.get(1) 
b = MyModel.query.get(1) 

a.somefield = 1 
b.somefield = 2 

a.save() 
# I didn't want to save b, changes of b weren't committed 

는 실제로 저장됩니다 무엇보다 제어를 할 :

a = MyModel.query.get(1) 
b = MyModel.query.get(1) 

a.somefield = 1 
b.somefield = 2 

# this will save both of changed models 
session.commit() 

이 나는 ​​그것이 작동하는 방법이다. 5 분마다 각 개체의 변경 내용을 저장하고 싶습니다.

+0

나만의 해결책을 찾았습니까? 가지고 있다면 공유하십시오. –

답변

2

다음과 같이 사용합니다 :

class BaseModel(object): 
    def save(self, commit=True): 
     # this part can be optimized. 
     try: 
      db.session.add(self) 
     except FlushError: 
      # In case of an update operation. 
      pass 

     if commit: 
      db.session.commit() 

    def delete(self, commit=True): 
     db.session.delete(self) 

     if commit: 
      db.session.commit() 

다음 내가 나의 모델을 정의

class User(db.Model, BaseModel) 

그래서, 지금 내가 할 수있는 :

u = User(username='foo', password='bar') 
u.save() 

이것은 당신이 달성하기 위해 계획하고 있었다 무엇인가?

2

나는 당신의 처지를 잘 모르겠다. 이 시점에서 장고에서

,

foo = MyModel(field1='value1', field2='value2') 
foo.save() 

또는 SQLAlchemy의에서 양자 택일

foo = MyModel.objects.create(field1='value1', field2='value2') 

,

foo = MyModel(field1='value1', field2='value2') 
session.add(foo) 

당신은 세션에 객체를 추가하고이 아직있다 거래를 저지른. 당신은 당신이

session.commit() 

을 요구되었다 어떤 변화 수행이 link 그 모습을 한 후에 만 ​​커밋해야합니다. 나는 Django ORM에서 SqlAlchemy로 쉽게 전환 할 수있을 것이라고 생각한다. 이러한 상황에 대한

UPDATE

, 당신은 여러 세션을 사용할 수 있습니다.

engine = create_engine("postgresql+psycopg2://user:[email protected]/test") 
metadata = MetaData(bind=engine) 
Session = sessionmaker(bind=engine) 
session1 = Session() 
session2 = Session() 
Base = declarative_base() 
class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    age = Column(Integer) 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 
    def __repr__(self): 
     return "<User('%s','%s')>" % (self.name, self.age) 
Base.metadata.create_all(engine) 

'test'db에 'users'테이블이 생성되었습니다. 또한 2 개의 세션 객체 인 session1과 session2가 초기화되었습니다.

a = User('foo','10') 
b = User('bar', '20') 
session1.add(a) 
session1.add(b) 
session1.commit() 

테이블 사용자는 이제 2 개 기록하는 'foo는'기록은 session1과 세션 2를 사용하여 '바'노래 가져 오기

1: foo, 10 
2: bar, 20 

있을 것이다.

foo.age = 11 
bar.age = 21 

이제이 개 기록에

foo = session1.query(User).filter(User.name == "foo").first() 
bar = session2.query(User).filter(User.name == "bar").first() 

만들기 변경, 당신은 foo는의 변화가 혼자 이월 할 경우

session1.commit() 

및 바

,

session2.commit() 
+0

나는 달성하고자하는 것을 명확히하기 위해 내 질문을 편집했습니다. – kjagiello

+0

난 내 응용 프로그램에 저장할거야 각 개체 당 하나의 세션이 필요하고 그것은 내 사건에 아주 큰 오버 헤드를 만들 것 같습니다. – kjagiello

0

은 이전 게시물을 자극하지 않기 위하여, 그러나

당신 말 :

나는 각각의 변경 사항을 저장하려면

는 매 5 분 정도 객체. 그래서

이유 Celery 같은 스케줄러를 사용하지 (내가 pyramid_celery 사용)

을두고 각이 5 분마다 객체를 저장할 수 있습니다, 당신은 장식 추가하여 예 :.

@periodic_task(run_every=crontab(minute="*/5") 
def somefunction(): 
    #your code here 

이를 특히 최신 버전인지 확인하기 위해 데이터베이스를 업데이트해야하는 경우 (시스템을 사용하는 사용자가 많은 경우)

희망이 있으면 도움이 될 것입니다. 와 함께, 5 분마다 절약 부분.