6

对于这种情况,假设有一个使用名为 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()

为什么第二种情况会失败,有没有办法让这种类型的语法在这里工作?

4

1 回答 1

15

尝试替换:

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 和 **kwargs?

于 2013-09-13T10:51:57.693 回答