对于这种情况,假设有一个声明的基数名为Game的表,其列名为“espn_game_id”和“a_name”。在变量“s”下打开一个会话对象。所以这有效:
s.add(Game(espn_game_id=888, a_name='lol'))
s.commit()
这失败了:
n = {"espn_game_id": 888, "a_name": 'lol'}
s.add(Game(n))
s.commit()
这有效(假设已经存在espn_game_id == 888的条目):
n = {"a_name": 'lol'}
s.query(Game).filter(Game.espn_game_id==888).update(n)
s.commit()
为什么第二种情况会失败,是否有办法让这种类型的语法在这里工作?
答案 0 :(得分:13)
尝试替换:
s.add(Game(n))
使用:
s.add(Game(**n))
我们假设你有这样的功能:
def foo(**kwargs):
print [item for item in kwargs.items()]
它希望关键字不是位置参数,所以这将起作用:
foo(**{'foo': 1, 'bar': 2})
这将失败:
foo({'foo': 1, 'bar': 2})
要获得更好的解释,请阅读*args and **kwargs?