17

使用 sqlalchemy 处理金字塔:

newjob_obj=Job(name=name,job_propery=job_property,sizeX=sizeX,
    sizeY=sizeY,quantity=quantity,timeline=timeline,
    description=description,remarks=remarks,
    client_id=client_id,created_by=created_by,status=status
)
new_job=session.add(newjob_obj)
print('Return newJob value %s\n' % new_job)

这里 new_job 打印为None. 会话的添加函数是否返回对象。请帮忙。

4

3 回答 3

32

在@mark's answer的评论中回答您的问题 - 为了在提交后收到您的“插入的 ID”:

session.add(newjob_obj)
session.commit()

您应该刷新插入的对象:

session.refresh(newjob_obj)
print newjob_obj.id

希望能帮助到你 ..

于 2016-12-29T12:01:59.493 回答
7

这是预期的输出。add()不返回值。文档

在 Session 中放置一个对象。

它的状态将在下一次刷新操作时持久化到数据库中。

重复调用 add() 将被忽略。add() 的反面是 expunge()。

代码

def add(self, instance, _warn=True):
    """Place an object in the ``Session``.

    Its state will be persisted to the database on the next flush
    operation.

    Repeated calls to ``add()`` will be ignored. The opposite of ``add()``
    is ``expunge()``.

    """
    if _warn and self._warn_on_events:
        self._flush_warning("Session.add()")

    try:
        state = attributes.instance_state(instance)
    except exc.NO_STATE:
        raise exc.UnmappedInstanceError(instance)

    self._save_or_update_state(state)

add 方法不返回值。当 Python 函数不返回值时,该函数的行为就像它返回None. 如果您想打印出作业,您可以打印:

session.add(newjob_obj)
print('Return newJob value %s\n' % newjob_obj)

add()你看,当你是会话的对象时,SQLAlchemy 不会真正做任何重要的事情(比如对数据库运行查询) 。它将做的只是跟踪对象存在的事实。那么当你做...

session.commit()

...您添加的所有对象都插入到数据库中(除其他外,例如对修改和删除的对象执行 UPDATE 和 DELETE)。

有关更多信息,请参阅文档中的使用会话章节

于 2013-10-15T18:57:26.147 回答
0

对于 SQLite,一旦提交,就可以直接从对象中获取插入的 id:

session.add(newjob_obj)
session.commit()
print('Return newJob id %d\n' % newjob_obj.id)
于 2020-06-24T02:58:41.323 回答