首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提交pickle类型的SQLAlchemy

提交pickle类型的SQLAlchemy
EN

Stack Overflow用户
提问于 2016-05-19 05:57:33
回答 2查看 2.8K关注 0票数 1

我在提交对sqlalchemy中的酸菜类型(列表)的更改时遇到了问题。它将表现为在提交之后什么都没有发生。

下面是我尝试提交的函数:

代码语言:javascript
运行
复制
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()

下面是表的设置方式:

代码语言:javascript
运行
复制
class Game(Base):
    __tablename__ = 'game'
    id = Column(Integer, primary_key=True)
    human_spaces = Column(PickleType)
    ai_spaces = Column(PickleType)
    available_spaces = Column(PickleType)

下面是我用来测试它的代码:

代码语言:javascript
运行
复制
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)

这是好的老终端告诉我的:

代码语言:javascript
运行
复制
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]
[]
[]

我确信这是我在这里遗漏的一些简单的东西,但任何帮助都将非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2016-05-19 15:50:48

问题是ORM不会对可变类型(如列表)中的更改发出警报。因此,SQLAlchemy通过sqlalchemy.ext.mutable扩展提供了突变跟踪。

documentation中的示例中,特别是在引用sqlalchemy.ext.mutable.MutableList类时,看起来列声明应该是这样的:

代码语言:javascript
运行
复制
human_spaces = Column(MutableList.as_mutable(PickleType))

我引用了有关as_mutable方法的文档:“这将建立侦听器,这些侦听器将检测针对给定类型的ORM映射,并向这些映射添加突变事件跟踪器。”

票数 4
EN

Stack Overflow用户

发布于 2016-05-19 19:37:01

我已经写了一个包来帮助简化这件事。您可以选择不同的编码,包括pickle,并且可以轻松地将对象转储和存储到数据库中。它可以连接到sqlalchemy理解的任何数据库。有一个指向SQL表的字典接口,您可以存储dill可以序列化的任何类型:

代码语言:javascript
运行
复制
>>> 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()
>>> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37310770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档