为什么SQLAlchemy在一个或两个语句中执行时不同地插入表达式values()方法函数?

时间:2013-11-16 23:40:05

标签: python sql sqlalchemy

我正在研究SQLAlchemy核心教程(http://docs.sqlalchemy.org/en/rel_0_8/core/tutorial.html)并发现了一个奇怪的行为。在“插入表达式”部分中,他们首先创建一个基本的插入表达式并将其打印出来。

>>> ins = users.insert()
>>> str(ins)
'INSERT INTO users (id, name, fullname) VALUES (:id, :name, :fullname)'

然后,他们执行相同的操作,向特定列添加值,这会将表达式中的列数限制为values()调用中列出的列数。

>>> ins = users.insert().values(name='jack', fullname='Jack Jones')
>>> str(ins)
'INSERT INTO users (name, fullname) VALUES (:name, :fullname)'

为什么如果我使用第二个版本并以2行而不是1行执行,values()调用不会?

>>> ins = users.insert()
>>> ins.values(name='jack', fullname='Jack Jones')
>>> str(ins)
'INSERT INTO users (id, name, fullname) VALUES (:id, :name, :fullname)'

我知道values()来电真的没有做任何事情,因为我测试了来自params来电的ins.compile().params值,并且他们在{2}中的版本中都是None线。

>>> ins = users.insert().values(name='jack', fullname='Jack Jones')
>>> ins.compile().params
{'fullname': 'Jack Jones', 'name': 'jack'}

>>> ins = users.insert()
>>> ins.values(name='jack', fullname='Jack Jones')
>>> ins.compile().params
{'fullname': None, 'password': None, 'id': None, 'name': None}

1 个答案:

答案 0 :(得分:2)

这两者之间的区别:

>>> ins = users.insert().values(name='jack', fullname='Jack Jones')
>>> ins.compile().params
{'fullname': 'Jack Jones', 'name': 'jack'}

>>> ins = users.insert()
>>> ins.values(name='jack', fullname='Jack Jones')
>>> ins.compile().params
{'fullname': None, 'password': None, 'id': None, 'name': None}

是你在第二种情况下没有保存ins的返回值。 我没有测试过,但要使它们等效,它应该是这样的:

>>> ins = users.insert()
>>> ins = ins.values(name='jack', fullname='Jack Jones')

否则,您对ins.values所做的事情就会消失