繁体   English   中英

SQLAlchemy提交泡菜类型

[英]SQLAlchemy committing pickle types

我在提交对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)

这就是好的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]
[]
[]

我敢肯定,这里缺少一些简单的东西,但是任何帮助将不胜感激!

问题在于,不会向ORM发出有关诸如列表之类的可变类型内部更改的警报。 因此, sqlalchemy.ext.mutable使用sqlalchemy.ext.mutable扩展名提供了突变跟踪。

文档中的示例中,尤其是参考sqlalchemy.ext.mutable.MutableList类,看起来列声明应该走了(例如):

human_spaces = Column(MutableList.as_mutable(PickleType))

我从有关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()
>>> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM