[PYTHON] sqlalchemy flush () 및 삽입 된 ID를 얻으려면?
PYTHONsqlalchemy 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.샘플 코드는 그대로 작동해야합니다. Sqlalchemy는 자동 생성 기본 키 열을 가정하고 f.id 값을 제공해야합니다. 기본 키 속성은 생성 될 때 flush () 프로세스에서 즉시 채워지며 commit ()을 호출해야합니다. 따라서 여기에 대한 답은 매핑의 세부 사항에 있습니다. 백엔드의 이상한 단점이있는 경우 (예 : SQLite는 복합 기본 키의 정수 값을 생성하지 않습니다) 및 / 또는 생성 된 SQL이 에코를 켜십시오.
샘플 코드는 그대로 작동해야합니다. Sqlalchemy는 자동 생성 기본 키 열을 가정하고 f.id 값을 제공해야합니다. 기본 키 속성은 생성 될 때 flush () 프로세스에서 즉시 채워지며 commit ()을 호출해야합니다. 따라서 여기에 대한 답은 매핑의 세부 사항에 있습니다. 백엔드의 이상한 단점이있는 경우 (예 : SQLite는 복합 기본 키의 정수 값을 생성하지 않습니다) 및 / 또는 생성 된 SQL이 에코를 켜십시오.
-
==============================
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.모두에게 감사드립니다. 열 매핑을 수정하여 내 문제를 해결했습니다. 나를 위해 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.dpb에 의해 주어진 대답과 달리 새로 고침이 필요하지 않습니다. 일단 플러시하면 ID 필드에 액세스 할 수 있고 sqlalchemy는 백엔드에서 자동으로 생성 된 ID를 자동으로 새로 고칩니다.
dpb에 의해 주어진 대답과 달리 새로 고침이 필요하지 않습니다. 일단 플러시하면 ID 필드에 액세스 할 수 있고 sqlalchemy는 백엔드에서 자동으로 생성 된 ID를 자동으로 새로 고칩니다.
이 문제가 발생하여 조사가 끝난 정확한 이유를 알아 냈습니다. 내 모델은 정수 필드로 ID를 사용하여 만들어졌으며 ID는 내 양식에 ID를 표시하고 싶지 않았기 때문에 ID가 hiddenfield로 표시되었습니다. 숨겨진 필드는 기본적으로 텍스트로 표시됩니다. 일단 widget = hiddenInput ()으로 정수 필드로 양식을 변경하면 문제가 해결되었습니다.
-
==============================
5.session.add 메서드를 호출하기 전에 id에 0을 할당하는 데 문제가있었습니다. ID가 데이터베이스에 의해 올바르게 지정되었지만 올바른 ID가 session.flush () 다음에 세션에서 검색되지 않았습니다.
session.add 메서드를 호출하기 전에 id에 0을 할당하는 데 문제가있었습니다. ID가 데이터베이스에 의해 올바르게 지정되었지만 올바른 ID가 session.flush () 다음에 세션에서 검색되지 않았습니다.
-
==============================
6.session.add (f) 대신 session.save_or_update (f)를 사용해야합니다.
session.add (f) 대신 session.save_or_update (f)를 사용해야합니다.
from https://stackoverflow.com/questions/1316952/sqlalchemy-flush-and-get-inserted-id by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] NumPy 배열의 요소 색인 (0) | 2018.10.22 |
---|---|
[PYTHON] Python에서 문자열을 풀링합니까? (0) | 2018.10.22 |
[PYTHON] matplotlib 색상 표로 seaborn color_palette (0) | 2018.10.22 |
[PYTHON] 어떻게 numpy 배열에 열을 추가하려면 (0) | 2018.10.22 |
[PYTHON] 언제 sqlalchemy back_populates를 사용해야합니까? (0) | 2018.10.22 |