簡體   English   中英

SQLAlchemy提交泡菜類型

[英]SQLAlchemy committing pickle types

我在提交對sqlalchemy中的泡菜類型(列表)進行更改時遇到問題。 承諾后好像什么也沒發生。

這是我嘗試提交的函數:

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)

這就是好的ol'終端告訴我的內容:

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]
[]
[]

我敢肯定,這里缺少一些簡單的東西,但是任何幫助將不勝感激!

問題在於,不會向ORM發出有關諸如列表之類的可變類型內部更改的警報。 因此, sqlalchemy.ext.mutable使用sqlalchemy.ext.mutable擴展名提供了突變跟蹤。

文檔中的示例中,尤其是參考sqlalchemy.ext.mutable.MutableList類,看起來列聲明應該走了(例如):

human_spaces = Column(MutableList.as_mutable(PickleType))

我從有關as_mutable方法的文檔中引用:“這將建立偵聽器,該偵聽器將針對給定類型檢測ORM映射,並向這些映射添加變異事件跟蹤器。”

我已經寫了一個程序包來簡化這個過程。 您可以選擇不同的編碼,包括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()
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM