我在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]
[]
[]
我确信这里有一些简单的东西,但是我会非常感激任何帮助!
答案 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()
>>>