FlaskSQLALCHEMY通过指定列名动态更新字段

9bfwbjaz  于 2022-10-02  发布在  Python
关注(0)|答案(2)|浏览(285)

如何通过在FlaskSQLAlChemy中指定列名来编程动态更新字段

我有一个名为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)

非常感谢

c7rzv4ha

c7rzv4ha1#

感谢Gord的解决方案,setattr(PTc, "goldPrice", 200)就是我想要的。

如果文档中的class.field = x约定禁止使用变量作为字段,那么是否存在另一种特定于SQLAlChemy的方法会很有趣,如果它们没有考虑到这一点的话会显得很了不起。

qvtsj1bj

qvtsj1bj2#

这真是太有帮助了!谢谢,高德·汤普森和默奇85岁!

target = PTc.query.order_by(PTc.id).first()
setattr(target, column, data_to_insert)
db.session.commit()

这就是使用它的方式。基本上,通过这种方式,您可以对列使用动态值。

相关问题