Python SQLAlchemy提交pickle类型
我在sqlalchemy中提交对pickle类型(列表)的更改时遇到问题。它将表现得好像在交付审判后什么也没有发生 以下是我尝试提交的函数:Python SQLAlchemy提交pickle类型,python,sql,sqlalchemy,commit,pickle,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_spac
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]
[]
[]
我相信这是我在这里错过的一些简单的东西,但任何帮助都将不胜感激 问题在于,ORM不会对可变类型(如列表)内的更改发出警报。因此,SQLAlchemy通过
SQLAlchemy.ext.mutable
扩展提供了突变跟踪
从中的示例中,特别是关于sqlalchemy.ext.mutable.MutableList
类的示例中,看起来列声明应该是:
我引用了as_mutable
方法的文档:
“这将建立监听器来检测针对给定类型的ORM映射,并向这些映射添加突变事件跟踪程序。”问题在于ORM不会收到可变类型(如列表)内部更改的警报。因此,SQLAlchemy通过
SQLAlchemy.ext.mutable
扩展提供了突变跟踪
从中的示例中,特别是关于sqlalchemy.ext.mutable.MutableList
类的示例中,看起来列声明应该是:
我引用了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()
>>>
我已经写了一个软件包来帮助实现这一点。您可以选择不同的编码,包括
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()
>>>
你能给你提出的问题再加一点细节吗?也许您希望输出是什么?我的问题是:我能做些什么使我对这些列表所做的更改正确地提交到数据库?底部代码块显示终端中打印的内容。该块的中间部分显示了我想要的值,它们在交付之前是正确的。但在我提交之后,(底部)它显示数据库中的值没有更改。有什么我遗漏的吗?我觉得这与pickle类型有关,但我不能完全确定,我希望我能得到一些与sqlalchemy有更多经验的人的反馈。你能为你所问的问题补充一点细节吗?也许您希望输出是什么?我的问题是:我能做些什么使我对这些列表所做的更改正确地提交到数据库?底部代码块显示终端中打印的内容。该块的中间部分显示了我想要的值,它们在交付之前是正确的。但在我提交之后,(底部)它显示数据库中的值没有更改。有什么我遗漏的吗?我觉得这与PickleType有关,但我不能完全确定,我希望能得到一些对sqlalchemy有更多经验的人的反馈。您也可以尝试本文最后一行中描述的方法:“另一种确保修改PickleType对象时更新它们的方法是在提交更改之前复制和分配它们。您也可以尝试本文档最后一行中描述的方法:”另一种确保修改PickleType对象时更新它们的方法是在提交更改之前复制和分配它们。”