SQLAlchemy提交pickle类型

时间:2016-05-18 21:57:33

标签: python sql sqlalchemy commit 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)

这里有什么好的&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]
[]
[]

我确信这里有一些简单的东西,但是我会非常感激任何帮助!

2 个答案:

答案 0 :(得分:2)

问题在于,ORM不会警告可变类型内的更改,例如列表。因此,SQLAlchemy提供了sqlalchemy.ext.mutable.MutableList扩展名的变异跟踪。

documentation中的示例,特别是参考human_spaces = Column(MutableList.as_mutable(PickleType)) 类,看起来应该是列声明(例如):

as_mutable

我引用了Boolean isClickedDummy; // global after the declaration of your class isClickedDummy = true; // in your onCreate() private void setupFollowButton(Button button, final Boolean isClicked) { button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if(isClickedDummy) { v.setBackgroundColor(Color.parseColor("#FF0000")); isClickedDummy = false; } else { v.setBackgroundColor(Color.parseColor("#FFFFFF")); isClickedDummy = true; } } }); } 方法的文档: "这将建立侦听器,它将检测针对给定类型的ORM映射,并为这些映射添加变异事件跟踪器。"

答案 1 :(得分: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()
>>>