2016-05-18 83 views
0

我遇到了一個問題,在sqlalchemy中提交了對pickle類型(列表)的更改。這將會在事情發生後沒有任何事情發生。SQLAlchemy提交pickle類型

這是我的我的作用,我嘗試提交:

def commit_move(game_id, player, move): 
    game = game_query(game_id) 
    if player == 'human': 
     game.human_spaces.append(move) 
    if player == 'ai': 
     game.ai_spaces.append(move) 
    game.available_spaces.remove(move) 
    print game.human_spaces 
    print game.ai_spaces 
    print game.available_spaces 
    print "----" 
    session.add(game) 
    session.commit() 

這裏的表是如何設置:

class Game(Base): 
    __tablename__ = 'game' 
    id = Column(Integer, primary_key=True) 
    human_spaces = Column(PickleType) 
    ai_spaces = Column(PickleType) 
    available_spaces = Column(PickleType) 

這裏是我使用來測試它的代碼:

game_id = create_game() 
print game_id 
print get_available_spaces(game_id) 
print get_human_spaces(game_id) 
print get_ai_spaces(game_id) 
print "---------" 
commit_move(game_id, 'human', 7) 
print get_available_spaces(game_id) 
print get_human_spaces(game_id) 
print get_ai_spaces(game_id) 

,這裏是什麼好醇」端告訴我:

1 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 
[] 
[] 
--------- 
[7] 
[] 
[1, 2, 3, 4, 5, 6, 8, 9] 
---- 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 
[] 
[] 

我敢肯定這件事情簡單我缺少在這裏,但任何幫助將不勝感激!

+0

可以添加更多的細節你問這個問題?也許你想要的輸出是什麼? –

+0

我的問題是:我能做些什麼,以便我對這些列表所做的更改能夠正確地提交給數據庫? 底部代碼塊顯示打印在終端上的內容。該塊的中間部分顯示了我想要的值,並且在提交之前它們是正確的。但是在我提交後,(底部)顯示數據庫中的值沒有改變。 有什麼我失蹤?我有一種感覺,它與PickleType有關,但我不完全確定,並希望我可以與對sqlalchemy有更多經驗的人得到一些反饋。 – HaydenThomas

回答

1

的問題是,ORM不驚動了一個可變型內變化,比如列表。因此SQLAlchemy提供了sqlalchemy.ext.mutable擴展的突變跟蹤。

documentation的例子,特別是參照sqlalchemy.ext.mutable.MutableList類,它看起來像列聲明應該去(例如):

human_spaces = Column(MutableList.as_mutable(PickleType)) 

我從上as_mutable方法的文檔引用: 「這建立了偵聽器,可以檢測針對給定類型的ORM映射,並將突變事件追蹤器添加到這些映射中。」

+0

你也可以嘗試在這[相關答案](http://stackoverflow.com/a/27981144/5869747)的最後一行中描述的方法:「另一種方法來確保您的PickleType對象在您修改它們時被更新是在提交更改之前複製並分配它們。「 –

1

我寫了一個包來幫助簡化這個過程。您可以選擇不同的編碼,包括pickle,並輕鬆地將對象轉儲並存儲到數據庫。它可以連接到sqlalchemy可以理解的任何數據庫。有一本字典接口與SQL表,您可以存儲任何類型的dill可以序列:

>>> import klepto 
>>> db = klepto.archives.sqltable_archive('playgame') 
>>> db['human'] = [1,2,3,4] 
>>> db['ai'] = [1,2] 
>>> db 
sqltable_archive('sqlite:///:memory:?table=playgame', {'ai': [1, 2], 'human': [1, 2, 3, 4]}, cached=True) 
>>> db.dump() 
>>>