Python pickle丢失了数据

时间:2011-02-26 20:54:01

标签: python google-app-engine pickle

我有4个嵌套类,参见示例:

class GameInfo:
    id = ""
    round = ""
    # ... etc

class Opponent:
    game_info = GameInfo()
    name = ""
    # ...

class Tournament:
    opponent_list = [] # list of Opponent objects
    # ...

class Journal(db.Model):
    picked_tournament = db.BlobProperty()  # here I put picked Tournament object

问题是:当我在pickled_tournament中取消Journal时,来自GameInfo的所有数据都将丢失。即opponent.name显示正确的值,但opponent.game_info.id显示空字符串。

我使用Google App Engine数据存储来存储数据,picked_tournament存储在BlobProperty()中。要序列化我调用的数据:journal.picked_tournament = pickle.dumps(tournament)。要加载我使用的数据:tournament = pickle.loads(journal.picked_tournament)

为什么泡菜不会超过2个级别?

UPD:数据设置如下:

gi = GameInfo()
gi.id = "1234"
opp = Opponent()
opp.name = "John"
opp.game_info = gi
t = Tournament()
t.opponent_list.append(opp)
# etc...

UPD2:刚刚发现,如果数据库是sqlite3,那么一切都可以在开发服务器上正常工作,但是如果没有sqlite3和appspot就行不通!

2 个答案:

答案 0 :(得分:3)

Opponent类的构造函数中,实例化GameInfo的单个副本,该副本由该类的所有实例使用。例如:

>>> o1 = Opponent()
>>> o1.game_info.id = 5
>>> o2 = Opponent()
>>> o2.game_info.id
5

相反,您需要为每个Opponent实例创建一个。通过在构造函数中初始化它来执行此操作,如下所示:

class Opponent:
    def __init__(self):
        game_info = GameInfo()

此外,由于它不是20世纪90年代,你真的应该使用new style classes

答案 1 :(得分:1)

基于App Engine文档(我在实践中没有尝试过),尝试将pickle数据设置为blob:

journal.picked_tournament = db.Blob(pickle.dumps(tournament))

如果这不起作用,请验证journal.picked_tournament == pickle.dumps(锦标赛)。