【发布时间】:2020-07-11 21:32:24
【问题描述】:
如何通过在 Flask-SQLAlchemy 中指定列名以编程方式动态更新字段
我有一个名为 PTc 的课程,它将只有一长排,因此我可以使用以下内容提取所有信息:
Target = PTc.query.order_by(PTc.id).first()
我可以手动更新字段,例如Target.price = 2 然后提交。
如何动态更新?即,当程序运行时,它可能希望根据条件更新价格、数量或可用性。
如果我将列名保存到变量 columnToUpdate = 'amount' 然后尝试 Target.columnToUpdate = 10 它当然会失败,因为它认为那是一列。
否则我不得不检查每个列的条件,这可能会因为列数过多而变得很麻烦,即
if columnToUpdate == 'price'
Target.price = 20
elif columnToUpdate =='amount':
Target.amount = 20
...
elif columnToUpdate =='XYZ':
Target.amount = ABC
我一直在查看文档,其中仅以最少的细节指定、插入、删除和选择。
附录 - 类如下所示。
class PTc(db.Model):
# id column
id = db.Column(db.Integer, primary_key=True)
goldPrice = db.Column(db.Integer, nullable=False)
goldStock = db.Column(db.Integer, nullable=False)
goldPriceChange = db.Column(db.String(50), nullable=False)
goldHistory = db.Column(db.String(100), nullable=False)
goldAverage = db.Column(db.Integer, nullable=False)
rmPrice = db.Column(db.Integer, nullable=False)
rmStock = db.Column(db.Integer, nullable=False)
rmPriceChange = db.Column(db.String(50), nullable=False)
rmHistory = db.Column(db.String(100), nullable=False)
rmAverage = db.Column(db.Integer, nullable=False)
gemsPrice = db.Column(db.Integer, nullable=False)
gemsStock = db.Column(db.Integer, nullable=False)
gemsPriceChange = db.Column(db.String(50), nullable=False)
gemsHistory = db.Column(db.String(100), nullable=False)
gemsAverage = db.Column(db.Integer, nullable=False)
oilPrice = db.Column(db.Integer, nullable=False)
oilStock = db.Column(db.Integer, nullable=False)
oilPriceChange = db.Column(db.String(50), nullable=False)
oilHistory = db.Column(db.String(100), nullable=False)
oilAverage = db.Column(db.Integer, nullable=False)
非常感谢
【问题讨论】:
-
你试过
setattr(obj_name, "price", 20)吗? -
害怕不高兴:
AttributeError: type object 'PTc' has no attribute 'setattr' -
类 PTc 长什么样,是 Json/dict 吗?
-
在描述中更新了类,它与他们的教程flask-sqlalchemy.palletsprojects.com/en/2.x中给出的示例非常相似
-
@Murchie85 - setattr 为我工作。请注意,它是一个内置函数,而不是类方法。
标签: python sqlite sqlalchemy flask-sqlalchemy