SQLAlchemy对象可以作为字典键吗?
这个场景是这样的:我有一个远程的数据库(读取速度慢),我通过一些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会简单地忽略那些没有映射的属性。