我有一个sqlite db,创建如下:
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 always),并将其相应的列的新元素作为函数的输入。
例如:
update_DB(VPN_routers, identifier={'sp_id':"sp-10.1.10.147"}, changes={'subnet_attached': "cbcbeiowj-d34f5tgygt-6g7ggrydwqrer3d", 'vpn_connectivity':"YES"})
*注意:标识符和更改并不总是相同的,标识符的长度固定为1,但更改的长度可能是可变的。
我尝试了很多方法,但我不能做到,完全依赖于这篇文章的答案。
发布于 2018-05-26 02:31:09
“标识符”很容易处理:只需使用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“。
https://stackoverflow.com/questions/50534036
复制相似问题