我在提交对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)
这是好的老终端告诉我的:
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]
[]
[]
我确信这是我在这里遗漏的一些简单的东西,但任何帮助都将非常感谢!
发布于 2016-05-19 15:50:48
问题是ORM不会对可变类型(如列表)中的更改发出警报。因此,SQLAlchemy通过sqlalchemy.ext.mutable
扩展提供了突变跟踪。
从documentation中的示例中,特别是在引用sqlalchemy.ext.mutable.MutableList
类时,看起来列声明应该是这样的:
human_spaces = Column(MutableList.as_mutable(PickleType))
我引用了有关as_mutable
方法的文档:“这将建立侦听器,这些侦听器将检测针对给定类型的ORM映射,并向这些映射添加突变事件跟踪器。”
发布于 2016-05-19 19:37:01
我已经写了一个包来帮助简化这件事。您可以选择不同的编码,包括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()
>>>
https://stackoverflow.com/questions/37310770
复制相似问题