sqlalchemy更新值为的特定特定列元素?

时间:2018-05-25 17:12:53

标签: python python-3.x sqlite sqlalchemy

我有一个sqlite数据库,创建如下:

class VPN_routers(Base):
    __tablename__ = 'vpnrouters'
    __table_args__ = TABLE_ARGS
    sp_id = Column(String(), primary_key=True)
    router_id = Column(String())
    external_gw = Column(String())
    subnet_attached = Column(String())
    vpn_connectivity = Column(String()

,表格内容如下:

sp-10.1.10.148|66c49f9b-11c4-4|172.24.4.6|cb3a722e-2ec4-4caf-a34b-93004d885f28|NO
sp-10.1.10.147|282608ba-8870-l|172.24.4.7|Not Attached|NO
sp-10.1.10.149|44cc77fe-3b2e-4|172.24.4.7|50853e0b-918f-4c5f-8188-3acbb23a829a|NO

我想更新sp_id =" sp-10.1.10.147"(使用sp_id标识)并将subnet_id和vpn_connectivity更新为新值的行。更新表后可能是这样的。

sp-10.1.10.148|66c49f9b-11c4-4|172.24.4.6|cb3a722e-2ec4-4caf-a34b-93004d885f28|NO
sp-10.1.10.147|282608ba-8870-l|172.24.4.7|cbcbeiowj-d34f5tgygt-6g7ggrydwqrer3d|YES
sp-10.1.10.149|44cc77fe-3b2e-4|172.24.4.7|50853e0b-918f-4c5f-8188-3acbb23a829a|NO

我正在尝试将此更新编写为一个函数,我可以将任何值作为行的标识符(不一定是sp_id),以及其对应的列新元素作为函数的输入。

例如:

update_DB(VPN_routers, identifier={'sp_id':"sp-10.1.10.147"}, changes={'subnet_attached': "cbcbeiowj-d34f5tgygt-6g7ggrydwqrer3d", 'vpn_connectivity':"YES"})

*注意:标识符和更改始终不相同,标识符的长度固定为1,但更改的长度可能不同。

我尝试了很多方法,但是我无法做到,完全依靠这篇文章来回答。

1 个答案:

答案 0 :(得分:0)

"标识符"易于处理:只需使用Query.filter_by()unpack the given dictionary as keyword arguments

由于Query.update()接受带有属性名称作为键的字典,因此处理更改就像向前传递字典一样简单:

def update_DB(cls, identifier, changes):
    session.query(cls).\
        filter_by(**identifier).\
        update(changes, synchronize_session=False)

只要两个字典都使用属性名称作为键,它就可以工作,但是您的示例包括" subnet_id"作为键,它不是映射类的属性。也许它应该是" subnet_attached"。

相关问题