【问题标题】:Update table in for loop SQLAlchemy (flask)更新 for 循环 SQLAlchemy 中的表(烧瓶)
【发布时间】:2021-06-01 13:49:34
【问题描述】:

我正在尝试执行以下操作:遍历 dict 中的一系列项目,并将每个项目添加到表格的新行中。

由于某种原因,添加仅适用于循环的最后一项。这是我的代码的一部分:

    ######
    # Model of interface_traffic table
    class InterfaceTraffic(UserMixin, db.Model):
        id = db.Column(db.Integer, primary_key=True)
        #
        network_device_id = db.Column(db.Integer, db.ForeignKey('network_device.id'))
        #    
        interface = db.Column(db.String(50), index=True, unique=False)
        traffic_in = db.Column(db.String(10), index=True, unique=False, default=0)
        traffic_out = db.Column(db.String(10), index=True, unique=False, default=0)

        def __repr__(self):
            return '<Interfaces Traffic For NetworkDevice ID: {}>'.format(self.network_device_id) 


    ######
    # Object From Models Tables (interface_traffic table)
    interface_traffic = InterfaceTraffic()
    hostname_for_id = NetworkDevice.query.filter_by(hostname=hostname).first()

    # Dict From Method check_interface_traffic(), provided by host Object Instance of Class NetworkElement
    traffic_on_interfaces = host.check_interface_traffic()

    # Populating Database Params
    for interface, traffic in traffic_on_interfaces.items():
        # interface_traffic.network_device_id is a foreign key
        interface_traffic.network_device_id = hostname_for_id.id
        interface_traffic.interface = interface
        interface_traffic.traffic_in = traffic[0]
        interface_traffic.traffic_out = traffic[1]
        db.session.add(interface_traffic)
        # I tryed with commit in each loop, but has the same behavior
        # db.session.commit()

    # I tryed with flush too, but has the same behavior
    # db.session.flush()
    db.session.commit()

【问题讨论】:

    标签: python-3.x for-loop flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您需要在for 循环中创建InterfaceTraffic(),否则它会被覆盖。

    for interface, traffic in traffic_on_interfaces.items():
        interface_traffic = InterfaceTraffic() #HERE
        interface_traffic.network_device_id = hostname_for_id.id
        interface_traffic.interface = interface
        interface_traffic.traffic_in = traffic[0]
        interface_traffic.traffic_out = traffic[1]
        db.session.add(interface_traffic)
    db.session.commit()
    

    【讨论】:

    • 非常感谢@PGHE,您的回答解决了我的问题,我在开发世界中是如此的新人,现在我真的不太了解......这是否意味着我的每一个新行必须实例化我的表的新对象?再次感谢...
    • 是的,您为每一行创建一个新对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2021-07-19
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多