Python + SQLAlchemy:如何在关系的对象字段之一更改后更新多对一关系?
Python + SQLAlchemy: how to update many-to-one relationship after one of relation's object field change?
我有三个 declarative_base 个模型。
class Region(BaseModel):
id = BaseModel.column(type='integer', primary_key=True)
# ...
y1 = BaseModel.column(type='float')
y2 = BaseModel.column(type='float')
x1 = BaseModel.column(type='float')
x2 = BaseModel.column(type='float')
map_id = BaseModel.column(type='mediumint')
units = relationship('Unit', primaryjoin="and_((Region.id == Unit.region_id), (Unit.unit_template_id))")
players = relationship('Player', lazy='subquery')
class Unit(BaseModel):
# ...
region_id = Object.column(type='integer',
foreign_key=db_name + '.region.id',
nullable=True)
region = relationship('Region', lazy='subquery')
class Player(Unit):
# ...
unit = relationship('Unit', lazy='subquery')
如您所见,Player
继承了 Unit
。 Region
包含单位列表和玩家列表。当我更改从单位继承的任何玩家字段时,该地区的 players
关系不会刷新。更改 Player
字段以刷新区域 players
与获取实际数据的关系后我该怎么办?
P.S。如果可能的话,我想避免额外保存到数据库,因为我需要先执行一些操作(比如计算等)。
区域的 players
关系完全基于从数据库中查询的对象,因此在更新数据库之前不会 "refresh"。
db.session.commit()
# now region.players is up to date
如果您真的很关心性能,您可以使用 内存中 Player
对象在保存到数据库之前执行任何操作。
players_list = region.players
players_list[0].field = "new value"
# now players_list is up to date while region.players is not
do_calculations(players_list)
# save to db after all calculations are done
db.session.commit()
我有三个 declarative_base 个模型。
class Region(BaseModel):
id = BaseModel.column(type='integer', primary_key=True)
# ...
y1 = BaseModel.column(type='float')
y2 = BaseModel.column(type='float')
x1 = BaseModel.column(type='float')
x2 = BaseModel.column(type='float')
map_id = BaseModel.column(type='mediumint')
units = relationship('Unit', primaryjoin="and_((Region.id == Unit.region_id), (Unit.unit_template_id))")
players = relationship('Player', lazy='subquery')
class Unit(BaseModel):
# ...
region_id = Object.column(type='integer',
foreign_key=db_name + '.region.id',
nullable=True)
region = relationship('Region', lazy='subquery')
class Player(Unit):
# ...
unit = relationship('Unit', lazy='subquery')
如您所见,Player
继承了 Unit
。 Region
包含单位列表和玩家列表。当我更改从单位继承的任何玩家字段时,该地区的 players
关系不会刷新。更改 Player
字段以刷新区域 players
与获取实际数据的关系后我该怎么办?
P.S。如果可能的话,我想避免额外保存到数据库,因为我需要先执行一些操作(比如计算等)。
区域的 players
关系完全基于从数据库中查询的对象,因此在更新数据库之前不会 "refresh"。
db.session.commit()
# now region.players is up to date
如果您真的很关心性能,您可以使用 内存中 Player
对象在保存到数据库之前执行任何操作。
players_list = region.players
players_list[0].field = "new value"
# now players_list is up to date while region.players is not
do_calculations(players_list)
# save to db after all calculations are done
db.session.commit()