SQLAlchemy插入w / Dictionary

时间:2013-09-13 10:49:47

标签: python sqlalchemy

对于这种情况,假设有一个声明的基数名为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()

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

1 个答案:

答案 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?