복붙노트

[PYTHON] sqlalchemy flush () 및 삽입 된 ID를 얻으려면?

PYTHON

sqlalchemy flush () 및 삽입 된 ID를 얻으려면?

나는 이런 식으로하고 싶다.

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입니다. 어떻게 작동시킬 수 있습니까?

- 그리고

해결법

  1. ==============================

    1.샘플 코드는 그대로 작동해야합니다. Sqlalchemy는 자동 생성 기본 키 열을 가정하고 f.id 값을 제공해야합니다. 기본 키 속성은 생성 될 때 flush () 프로세스에서 즉시 채워지며 commit ()을 호출해야합니다. 따라서 여기에 대한 답은 매핑의 세부 사항에 있습니다. 백엔드의 이상한 단점이있는 경우 (예 : SQLite는 복합 기본 키의 정수 값을 생성하지 않습니다) 및 / 또는 생성 된 SQL이 에코를 켜십시오.

    샘플 코드는 그대로 작동해야합니다. Sqlalchemy는 자동 생성 기본 키 열을 가정하고 f.id 값을 제공해야합니다. 기본 키 속성은 생성 될 때 flush () 프로세스에서 즉시 채워지며 commit ()을 호출해야합니다. 따라서 여기에 대한 답은 매핑의 세부 사항에 있습니다. 백엔드의 이상한 단점이있는 경우 (예 : SQLite는 복합 기본 키의 정수 값을 생성하지 않습니다) 및 / 또는 생성 된 SQL이 에코를 켜십시오.

  2. ==============================

    2.난 그냥 같은 문제에 걸쳐 실행하고 테스트 후 나는이 답변 중 아무 것도 충분하다는 것을 발견했습니다.

    난 그냥 같은 문제에 걸쳐 실행하고 테스트 후 나는이 답변 중 아무 것도 충분하다는 것을 발견했습니다.

    현재, 또는 sqlalchemy .6 +에서, 매우 간단한 해결책이 있습니다 (이전 버전에서는 존재하는지 모르지만 상상할 수는 있습니다).

    session.refresh ()

    그래서 코드는 다음과 같이 보입니다.

    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.
    

    그렇게하는 방법입니다.

  3. ==============================

    3.모두에게 감사드립니다. 열 매핑을 수정하여 내 문제를 해결했습니다. 나를 위해 autoincrement = True가 필요합니다.

    모두에게 감사드립니다. 열 매핑을 수정하여 내 문제를 해결했습니다. 나를 위해 autoincrement = True가 필요합니다.

    유래: id = Column ( 'ID', 정수, primary_key = True, nullable = False)

    수정 후 : ID = 열 ( 'ID', 정수, primary_key = True, autoincreament = True, nullable = True)

    그때 session.flush () 인쇄 (f.id)

    괜찮아!

  4. ==============================

    4.dpb에 의해 주어진 대답과 달리 새로 고침이 필요하지 않습니다. 일단 플러시하면 ID 필드에 액세스 할 수 있고 sqlalchemy는 백엔드에서 자동으로 생성 된 ID를 자동으로 새로 고칩니다.

    dpb에 의해 주어진 대답과 달리 새로 고침이 필요하지 않습니다. 일단 플러시하면 ID 필드에 액세스 할 수 있고 sqlalchemy는 백엔드에서 자동으로 생성 된 ID를 자동으로 새로 고칩니다.

    이 문제가 발생하여 조사가 끝난 정확한 이유를 알아 냈습니다. 내 모델은 정수 필드로 ID를 사용하여 만들어졌으며 ID는 내 양식에 ID를 표시하고 싶지 않았기 때문에 ID가 hiddenfield로 표시되었습니다. 숨겨진 필드는 기본적으로 텍스트로 표시됩니다. 일단 widget = hiddenInput ()으로 정수 필드로 양식을 변경하면 문제가 해결되었습니다.

  5. ==============================

    5.session.add 메서드를 호출하기 전에 id에 0을 할당하는 데 문제가있었습니다. ID가 데이터베이스에 의해 올바르게 지정되었지만 올바른 ID가 session.flush () 다음에 세션에서 검색되지 않았습니다.

    session.add 메서드를 호출하기 전에 id에 0을 할당하는 데 문제가있었습니다. ID가 데이터베이스에 의해 올바르게 지정되었지만 올바른 ID가 session.flush () 다음에 세션에서 검색되지 않았습니다.

  6. ==============================

    6.session.add (f) 대신 session.save_or_update (f)를 사용해야합니다.

    session.add (f) 대신 session.save_or_update (f)를 사용해야합니다.

  7. from https://stackoverflow.com/questions/1316952/sqlalchemy-flush-and-get-inserted-id by cc-by-sa and MIT license