2010-07-05 44 views
3

我想檢查數據庫中的不同值,並創建一個新的值,所以我需要查詢,我不知道如果我必須在我的創建會話SQLAlchemy類,或者我該怎麼做呢?使用會議像全球?,我沒有在文檔中找到。如何使用會話,而不必通過它[SqlAlchemy]

事端這樣的:

class MyClass(Base): 

    __tablename__ = 'my_class' 
    __table_args__ = (UniqueConstraint('key', 'key2'), 
        {} 
        ) 
    id = Column(Integer, Sequence('my_class_id'), primary_key=True) 
    key = Column(String(30), nullable= False) #unique together key2 
    key2 = Column(String(30), nullable = False) 
    value = Column(Integer, nullable=False) 

    def __init__(self, key, key2): 
     #check if exist key and key2 
     values = session.query(MyClass.value).filter(MyClass.key == self.key).\ 
      filter(MyClass.key2 == self) 

     if values: 
      raise IntegrityError 

     #get biggest value 
     value = session.query(MyClass.value).filter(MyClass.key = self.key).order_by(asc(MyClass.value)) #I'm not shure if i need 'asc' 
     #no value new key and key2 

     if not value: 
      self.key = key 
      self.key2 = key2 
      self.value = '000' 
      return 

     #i used a single table beacuse is easier to understand 
     #in this example 
     self.key = key 
     self.key2 = key 
     self.value = increment(value.first()) 

我使用SQLAlchemy的6.2和聲明

感謝

+0

這是不是更好地處理數據庫中,使用唯一索引? – codeape 2010-07-05 20:10:44

+0

它會更容易,但任何我想學習如何做的方式,但我看到,這不像django DRM那麼容易,任何方式,我不能在__init__上做,因爲它必須綁定到某些會話 – sacabuche 2010-07-05 21:52:22

+0

無論如何,值將被用於很多,它必須是緊湊的,這就是因爲我使用一個字符串做'1Za'這樣的事情 – sacabuche 2010-07-05 21:55:22

回答

1

你將不得不做你自己的會話管理 - 例如定義一個模塊全局會話對象。

例如,主塔應用程序定義他們的會話是這樣的:

from sqlalchemy.orm import scoped_session, sessionmaker 
Session = scoped_session(sessionmaker()) 

再後來將其綁定到一個發動機

Session.configure(bind=engine) 

使用scoped_session將意味着你的代碼是線程安全的(每個線程將使用自己的會話)。

1

我發現here,我們可以做Session.object_session(個體經營)

def new_value(self): 
    #not really DRY 
    #the object has to be binded with some session first. 
    session = Session.object_session(self) # << this is the important stuff 

    #check if exist key and key2 
    values = session.query(MyClass.value).filter(MyClass.key == self.key).\ 
     filter(MyClass.key2 == self) 

    if values: 
     return #None 

    #get biggest value 
    value = session.query(MyClass.value).\ 
       filter(MyClass.key = self.key).\ 
       order_by(desc(MyClass.value)) 

    return increment(value.first()) 
+1

這不適用於未創建的對象但是,添加到會話中。而且,由於您試圖從構造函數中使用它,這意味着您根本無法創建新對象。 – 2010-07-10 14:56:08

+0

事實上,我在一個MapperExtension裏面更改了這部分代碼,在before_insert裏面,我會更新我的代碼 – sacabuche 2010-07-11 15:49:49

相關問題