代码之家  ›  专栏  ›  技术社区  ›  Eloff

sqlalchemy flush()并获取插入的id?

  •  81
  • Eloff  · 技术社区  · 17 年前

    我想这样做:

    f = Foo(bar='x')
    session.add(f)
    session.flush()
    
    # do additional queries using f.id before commit()
    print f.id # should be not None
    
    session.commit()
    

    但是 f.id None

    6 回复  |  直到 7 年前
        1
  •  150
  •   dpb    15 年前

    我刚刚遇到了同样的问题,经过测试,我发现这些答案都不够。

    目前,或者在sqlalchemy.6+中,有一个非常简单的解决方案(我不知道在以前的版本中是否存在这种情况,尽管我想它确实存在):

    因此,您的代码将如下所示:

    f = Foo(bar=x)
    session.add(f)
    session.flush()
    # At this point, the object f has been pushed to the DB, 
    # and has been automatically assigned a unique primary key id
    
    f.id
    # is None
    
    session.refresh(f)
    # refresh updates given object in the session with its state in the DB
    # (and can also only refresh certain attributes - search for documentation)
    
    f.id
    # is the automatically assigned primary key ID given in the database.
    

    这就是怎么做的。

        2
  •  85
  •   MarredCheese Lionia Vasilev    7 年前

    您的示例代码应该按原样工作。SQLAlchemy应该为 f.id ,假定它是自动生成的主键列。主键属性将立即填充到 flush() 在生成时进行处理,并且不调用 commit()

    1. 映射的详细信息
    2. 如果使用的后端有任何奇怪的地方(例如,SQLite不会为复合主键生成整数值)
    3. 打开echo时发出的SQL会说什么
        3
  •  28
  •   MarredCheese Lionia Vasilev    7 年前

    谢谢大家。我通过修改列映射解决了我的问题。为了我, autoincrement=True 是必需的。

    来源:

    id = Column('ID', Integer, primary_key=True, nullable=False)
    

    修改后:

    id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
    

    然后

    session.flush()  
    print(f.id)
    

    可以!

        4
  •  6
  •   Ryan    11 年前

    与dpb给出的答案不同,不需要刷新。 刷新后,可以访问id字段,sqlalchemy会自动刷新在后端自动生成的id

    我遇到了这个问题,经过一些调查,我找到了确切的原因。我的模型是用id作为integerfield创建的,在我的表单中,id用hiddenfield表示(因为我不想在表单中显示id)。默认情况下,隐藏字段表示为文本。一旦我用widget=hiddenInput()将表单更改为integerfield,问题就解决了。

        5
  •  1
  •   babky    11 年前

    我曾经在分配任务时遇到问题 0 打电话前先确认身份 session.add 方法数据库已正确分配id,但之后未从会话中检索到正确的id session.flush() .

        6
  •  0
  •   joselito    5 年前

    我的代码是这样工作的:

    f = Foo(bar="blabla")
    session.add(f)
    session.flush()
    session.refresh(f, attribute_names=[columns name that you want retrieve]
    # so now you can access the id inserted, for example
    return f.id # id inserted will be returned
    
        7
  •  -6
  •   Mohit Ranka    17 年前

    你应该尝试使用 session.save_or_update(f) 而不是 session.add(f) .