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

ut6juiuv  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(236)

如何通过在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)
p4tfgftt

p4tfgftt1#

多亏了Gord的解决方案,setattr(PTc, "goldPrice", 200)就是我想要的。
如果文档中的class.field = x约定禁止使用变量作为字段,那么是否存在另一种特定于SQLAlChemy的方法会很有趣,如果它们没有考虑到这一点的话会显得很了不起。

soat7uwm

soat7uwm2#

这真是太有帮助了!谢谢,@戈德·汤普森和@Murchie85!

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

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

相关问题