我正在研究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}
答案 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
所做的事情就会消失