Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy提交pickle类型_Python_Sql_Sqlalchemy_Commit_Pickle - Fatal编程技术网

Python 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

我在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)
好的终端告诉我:

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对象时更新它们的方法是在提交更改之前复制和分配它们。”