SQLAlchemy对象可以作为字典键吗?

3 投票
1 回答
2789 浏览
提问于 2025-04-16 19:54

这个场景是这样的:我有一个远程的数据库(读取速度慢),我通过一些ORM映射的类从中获取数据。

我想在ORM数据旁边存储一些非数据库的临时数据,但我不想在映射类的命名空间里添加很多临时属性,因为这些类是其他人也在用的。我真正想做的是把这些临时数据当作字典的键来使用。

我看到过这个讨论,所以我知道这是可以做到的,但我不太喜欢那个例子:

def __hash__( self ):
    return id( self ) if self.id is None else hash( self.id )

因为我的使用场景中有一个数据库设置的自增主键,这个主键在刷新之前是不存在的。哈希值可能会变化,这是哈希的一大忌讳,我想避免这种情况。

我可以尝试在__hash__里加一个刷新,但这样做的副作用太大,感觉不是个好主意。

所以,我想问的是:有没有好的方法可以把ORM映射类的实例用作字典的键,或者有没有其他更好的方法来将临时数据与对象关联,而不污染它的命名空间?

1 个回答

4

考虑把你本地的、不是数据库的数据存储在合适的映射实例中,作为一个非映射属性。比如:

local_data = {'batsman': 'Sangakkara', 'bowler': 'Swann'}
mapped_instance_from_query._local_data = local_data

SQLAlchemy会简单地忽略那些没有映射的属性。

撰写回答