2011-09-16 40 views
3

我有一個數據庫提交SQLalchemy問題。這裏是我的場景,我有一個要添加到表中的記錄列表。一旦將記錄添加到表中,我需要獲取插入的記錄標識並對另一個表執行另一個插入。我正在單個會話中進行這些操作。問題,同時在迴路中使用SQLAlchemy Session對象提交數據

do the session.add(obj) 

session.commit() 

get obj.id 

do the session.add(obj2) # with obj2 having the id from the obj 

session.commit() 

這裏只有最後一個記錄數據越來越:下面,因爲我不能給出代碼

創建一個會話對象

循環記錄列表中插入的代碼結構給出承諾如果我們有多個記錄

任何人都可以幫我解決這個問題。

+0

不可能告訴,寫一些示例代碼,它有相同的問題 – knitti

回答

4

你可以嘗試重組代碼中使用此:

Session = sqlalchemy.orm.sessionmaker(...) 
def transaction(self, callback): 
    session = sqlalchemy.orm.scoped_session(Session) 
    try: 
    result = callback(session) 
    except: 
    session.rollback() 
    raise 
    else: 
    session.commit() 
    finally: 
    session.close() 
    return result 

然後每一筆交易在它自己的功能發生,就像這樣:

def updatetxn(pk, newvalue): 
    def txn(session): 
    obj = session.query(myclass).filter_by(id=pk).one() 
    obj.field = newvalue 
    session.add(obj) 
    return txn 

transaction(updatetxn(4, 'abc')) 

處理提交/回滾邏輯在一個地方,並依靠函數範圍來確定工作單​​元的範圍,可以降低應用程序的複雜性並消除您尚未找到的錯誤。

7

有一個很好的機會,你不需要需要發出兩個提交;使用sqlalchemy會話的主要原因之一是它能夠理解對象如何相互關聯,並且會以插入數據的方式正確插入數據並正確表示所需的結構。這主要通過relationship構造來起作用。這裏有一個簡單的例子:

>>> from sqlalchemy import * 
>>> from sqlalchemy.orm import * 
>>> from sqlalchemy.ext.declarative import declarative_base 
>>> Base = declarative_base() 

>>> class A(Base): 
...  __tablename__ = "a_table" 
...  id = Column(Integer, primary_key=True) 
... 
>>> class B(Base): 
...  __tablename__ = "b_table" 
...  id = Column(Integer, primary_key=True) 
...  a_id = Column(Integer, ForeignKey(A.id)) 
...  a = relationship(A) 
... 
>>> my_a = A() 
>>> my_b = B() 
>>> my_b.a = my_a 
>>> 

最重要的部分是,我們通過B.a聲明AB之間的關係。爲了充分利用這一點,通過這種關係屬性表達每個實例之間的關係非常重要,並讓sqlalchemy負責設置a_id列本身。

>>> engine = create_engine("sqlite:///:memory:") 
>>> Base.metadata.create_all(engine) 
>>> engine.echo = True 
>>> Session = sessionmaker(engine) 
>>> 
>>> session = Session() 
>>> session.add(my_a) 
>>> session.add(my_b) 
>>> 
>>> session.commit() 

隨着echo=True,輸出看起來有點像這樣:

2011-09-16 17:19:22,367 INFO sqlalchemy.engine.base.Engine.0x...ed50 BEGIN (implicit) 
2011-09-16 17:19:22,368 INFO sqlalchemy.engine.base.Engine.0x...ed50 INSERT INTO a_table DEFAULT VALUES 
2011-09-16 17:19:22,368 INFO sqlalchemy.engine.base.Engine.0x...ed50() 
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 INSERT INTO b_table (a_id) VALUES (?) 
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 (1,) 
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 COMMIT 

注意,my_a對象被插入,並且SQLAlchemy的讀取分配的主密鑰,並使用該用於插入用於my_b

相關問題