SQLAlchemy插入w/Dictionary

app*_*ver 5 python sqlalchemy

对于这种情况,假设有一个声明的基表名为Game的表,其列名为"espn_game_id"和"a_name".在变量"s"下打开一个会话对象.这样可行:

s.add(Game(espn_game_id=888, a_name='lol'))
s.commit()
Run Code Online (Sandbox Code Playgroud)

这失败了:

n = {"espn_game_id": 888, "a_name": 'lol'}
s.add(Game(n))
s.commit()
Run Code Online (Sandbox Code Playgroud)

这是有效的(假设已经存在espn_game_id == 888的条目):

n = {"a_name": 'lol'}
s.query(Game).filter(Game.espn_game_id==888).update(n)
s.commit()
Run Code Online (Sandbox Code Playgroud)

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

zer*_*323 13

尝试替换:

s.add(Game(n))
Run Code Online (Sandbox Code Playgroud)

有:

s.add(Game(**n))
Run Code Online (Sandbox Code Playgroud)

我们假设你有这样的功能:

def foo(**kwargs):
    print [item for item in kwargs.items()]
Run Code Online (Sandbox Code Playgroud)

它期望关键字不是位置参数,所以这将工作:

foo(**{'foo': 1, 'bar': 2}) 
Run Code Online (Sandbox Code Playgroud)

这将失败:

foo({'foo': 1, 'bar': 2}) 
Run Code Online (Sandbox Code Playgroud)

为了更好的解释,你应该阅读*args和**kwargs?