2014-10-16 2 views
4

모델의 새 인스턴스를 만들고 ID를 설정할 수 있습니까? 이 작업을 시도 할 때마다 모델은 유지되지만 ID는 MySQL 자동 증가 목록에서 사용 가능한 다음 번호로 설정됩니다.새 모델에 ID 설정

예를 들어 나는이 같은 새로운 센서를 만들려면 :

s = new Sensor() 
s.id = 14 
s.name = 'my sensor' 
db.session.add(s) 
db.session.commit() 

saved_instance = Sensor.query.get(14) 
assert saved_instance is not None 

어설 션이 실패합니다.

+0

커밋 직후에 s.id가 무엇인지 확인할 수 있습니까? 당신의 테이블에 ID를 설정하고 그것이 이미 설정되어 있는지 확인하지 않는 트리거가있을 수 있습니까? – Werner

+0

어떤 백엔드를 사용하고 있습니까? 에코 된 SQL의 모습은 어떻습니까? – ACV

+0

게시물을 '센서'클래스의 선언으로 업데이트하십시오. 'sqlite'를 백엔드로 사용할 때이 동작이 일어 났는지 확인할 수 있습니까? 쉬운 테스트 ->'엔진 = create_engine ('sqlite : //')' – Jason

답변

1

필자는 사용자가 확실하게 알 수있는 정보를 제공하지 않았기 때문에 사지를 사용해야 하겠지만 센서 선언에 자동 증가가 사용된다고 생각합니다. 그렇다면 손을 완전히 설정하기 전에 설정하십시오.

sensor = Table('sensor', metadata, 
    Column('id', Integer, primary_key = True), 

MySQL에는 기본 키가 자동 증가로 미리 패키지되어 있습니다.

대부분의 데이터베이스 (MySQL 포함)의 경우 데이터베이스에 ID 14가 존재했다면 자동 증가로 인해 생성 단계에서 해당 번호가 다시 사용될 수 없습니다. ID가 14 인 행을 삭제 한 경우에도 마찬가지입니다.

사실을 확인한 후 해당 ID가 시스템에없는 경우 다른 행을 업데이트 할 수 있습니다.

s = new Sensor() 
s.id = 14 
s.name = 'my sensor' 
db.session.add(s) 
db.session.commit() 

saved_instance = Sensor.query.get(14) 
print(saved_instance is not None) # Should fail. 

print(s.id) # will return the ID that was actually inserted. 
s.update().\ 
    where(users.c.id==s.id).\ 
    values(id=14) 
+0

늦은 답신에 사과하지만, 내 ID 필드는 실제로 자동 증가를 사용합니다. 여기서 프로그래밍 방식으로하는 일은 기본적으로 내가 현재 손으로하는 일입니다. 이것이 이것이 유일한 방법이었던 것 같았습니다. 그것은 매우 해킹 된 것처럼 보였습니다. 그러나 이것이 유일한 길이라면, 그것이되어야합니다. 도와 주셔서 감사합니다! – jaapz

+0

대부분의 데이터베이스에는 '자동 증가'에 가정 된 일련의 가정이 있으며, 그 중 하나는 값이 단조롭게 증가한다는 것입니다. 이 가정이 깨진다면 매우 위험한 데이터베이스 기능이 잔뜩 있는데 이는 MySQL이 처음 사용 후 ID를 다시 생성하지 않는 이유입니다. – AlexLordThorsen