2013-12-13 2 views
0

SQLAlchemy를 사용하고 있습니다 (현재 SQLite에서 테스트 중이지만 다른 곳에서도 사용해야합니다). 그리고 기본 키 ID가 재사용되는 데 문제가 있습니다.SQLAlchemy가 숫자 ID를 다시 사용하지 않는지 확인하십시오.

예를 들어 ID가 1-6 인 콘텐츠를 삭제 한 다음 ID가 4 인 콘텐츠를 삭제하면 다음 콘텐츠의 ID가 7이 아닌 4로 추가됩니다 (현재로서는 일어난다). ID는 세션 재설정 후에 재사용 할 수 있습니다 (실제로는 상관 없지만).

이것은 DB의 유형 (그리고 자동 증가 정책/구현의)에 따라 다르 겠지만 적어도 SQLite, mySQL 및 PostgreSQL (다른 것들은 작동하도록하는 방법이 필요합니다. 중요하지 않지만 어느 쪽도 아프지 않을 것입니다.)

도움이 필요하거나 올바른 방향을 가리키면 감사하겠습니다!

+2

올바르게 지적했듯이 이것은 SA 자체에 의존하지 않고 RMDBS에만 해당됩니다. 그러나 필자가 아는 한 자동 증가 관련 전략의 기본 동작은 기본적으로 * 재사용 * 해제 * 식별자를 사용하지 않습니다. 왜 귀하의 질문은 그렇지 않겠습니까? 어떤예요? – van

+1

ID가 4 인 행을 삭제할 때도 SQLite는 ID 7을 여전히 사용하지 않습니다 ** ** 여전히 ID가 4 인 행을 삭제할 때도 * 가장 높은 ID * 행 (예 : ID 6)을 삭제하면 예, 그 값을 재사용 할 것입니다. –

답변

2

이것은 RDBMS 관련 기능입니다. SQLAlchemy가 우려 할 사항이 아닙니다.

일반적으로 데이터베이스는 단조롭게 증가하는 ID를 사용합니다 (새 값은 이전 값보다 높으며 일반적으로 +1이지만 더 큰 단계가 가능함).

유일한 예외는 SQLite입니다. 현재 에 가장 높은 수치를 줄 것입니다. 값 +1. 즉, 테이블에서 MAX(id)을 삭제하면 해당 ID는 이후 행 삽입을 위해 재사용 될 수 있습니다. SQLite autoincrement documentation을 참조하십시오. 귀하가 귀하의 게시물에서 주장하는 행동이 실제로 일어나지는 않습니다. MAX(rowid) + 1이 선택되거나 SELECT seq + 1 FROM sqlite_sequence WHERE name=<tablename>;이 대신 사용됩니다.

테이블에 대해 sqlite_autoincrement=True을 설정하면 올바른 자동 증가 (값을 재사용하지 않음)로 전환 할 수 있습니다. specific dialect documentation을 참조하십시오.

Oracle을 백엔드로 사용할 계획이라면 자동 증가가 필요한 열에 explicitly add a Sequence()도 필요합니다.

관련 문제