首页 > 解决方案 > Flask-sqlalchemy 通过指定列名动态更新字段

问题描述

如何通过在 Flask-SQLAlchemy 中指定列名以编程方式动态更新字段

我有一个名为PTcIt 的课程只会有一个长排,因此我可以使用以下内容拉回所有信息:

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)

非常感谢

标签: pythonsqlitesqlalchemyflask-sqlalchemy

解决方案


setattr(PTc, "goldPrice", 200)就是我一直在寻找的,感谢 Gord 的解决方案。

class.field = x鉴于记录的约定阻止将变量用作字段,并且如果他们没有考虑到这一点,那么它会很想看看是否存在另一种 SQLAlchemy 特定方法。


推荐阅读