gpt4 book ai didi

python - 根据相关列值插入列

转载 作者:行者123 更新时间:2023-11-30 22:03:59 26 4
gpt4 key购买 nike

这似乎是一个真正的初学者问题,但我很难找到简单的答案。我使用表示一对多关系的简单数据模型将其简化为简单的框架:

class Room(db.Model):
__tablename__ = 'rooms'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
capacity = db.Column(db.Integer)
events = db.relationship('Event', backref='room')


class Event(db.Model):
__tablename__ = 'counts'
id = db.Column(db.Integer, primary_key=True)
unusedCapacity = db.Column(db.Integer)
attendance = db.Column(db.Integer)
room_id = db.Column(db.Integer, db.ForeignKey('rooms.id'))

Event.unusedCapacity 的计算方式为 Room.capacity - Event.attendance,但我需要将该值存储在列中 — Room.capacity code> 可能会随着时间的推移而变化,但 Event.unusedCapacity 需要反射(reflect)事件发生时实际未使用的容量。

我当前正在查询房间,然后创建事件:

room = Room.query.get(room_id) # using Flask sqlAlchemy
event = event(unusedCapacity = room.capacity - attendance, ...etc)

我的问题是:是否有一种更有效的方法可以一步完成此操作?

最佳答案

正如@SuperShoot 的评论中所指出的,插入查询可以计算数据库中未使用的容量,而无需先获取。显式构造函数(例如 @tooTired 所示)可以将标量子查询作为 unusedCapacity 传递:

class Event(db.Model):
...
def __init__(self, **kwgs):
if 'unusedCapacity' not in kwgs:
kwgs['unusedCapacity'] = \
db.select([Room.capacity - kwgs['attendance']]).\
where(Room.id == kwgs['room_id']).\
as_scalar()
super().__init__(**kwgs)

虽然可以使用client-invoked SQL expressions默认情况下,我不确定如何在不使用 context-sensitive default function 的情况下引用要插入表达式中的值,但这并没有完全解决:标量子查询没有内联,SQLAlchemy 尝试使用占位符来传递它。

__init__ 方法的缺点是,您无法使用为模型创建的表按原样执行批量插入来处理未使用的容量,而必须执行执行相同操作的手动查询.

另一件需要注意的事情是,在发生刷新之前,新 Event 对象的 unusedCapacity 属性保存的是 SQL 表达式对象,而不是实际值。 @tooTired 的解决方案在这方面更加透明,因为新的 Event 对象将从一开始就保存未使用容量的数值。

关于python - 根据相关列值插入列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53421156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com