내 모델은 매우 복잡하며 기존 스토어드 프로 시저의 로직을 가져 와서 이식성을 위해 SQLAlchemy로 변환하려고합니다.프리 페치 컬럼 시퀀스 SQLAlchemy
그러나 저는 커밋되지 않은 데이터로 고민하고 있습니다. 내가 status
테이블이 1D, 이름 :
내가 user
테이블이 ID를 이름 나는 user_statuses
테이블이 : ID 266 status_id, from_dt,
지금, 나는이 모든 테이블을 채울 필요가 to_dt 단일 트랜잭션 내에서 실행되거나 실패합니다. 문제 :
user = User(name = 'Test')
status = Status(name = 'Active')
db.session.add(user)
db.session.add(status)
# Oooopa! This is where it fails
user_session = UserStatuses(user_id=user.id, status_id=status.id, datetime.utcnow(), datetime(9999,01,01,00,00,00))
# both user.id and status.id = None as it's uncommited!
기본적으로 명시 적 SQL없이 테이블 시퀀스에 액세스 할 수 있어야합니다. 왜? 이식성. 현재 내가 PGSQL를 사용하여이 작업을 수행 할 수 있습니다 : MySQL의 & BANG에
class User(Base):
....
@staticmethod
def prefetch_id():
db.session.execute("SELECT NEXTVAL('user_id_seq');").scalar()
변경 엔진! 응용 프로그램이 고장났습니다.
방법에 대한 아이디어가 있으십니까? 이 메시지는 한 번에 수천 명의 사용자가 액세스하는 매우 높은 트랜잭션 응용 프로그램 일 수 있습니다.
'UserStatuses'란 무엇입니까? 존재하지 않는 사용자 등으로 사용자 세션을 만들려고합니까? 트랜잭션 시작과 관련하여 잘못된 점은 무엇입니까? –
당신의 솔루션은 훌륭합니다. 문제를 해결할 수있는 또 다른 옵션은 객체'user'와'status'를'UserStatuses' 생성자에 직접 넘기는 것입니다. 아직 'id'가 없더라도 세션은 모든 관계를 적절히 해결할 수 있습니다. – mtth
스펜서, 불행히도 제 예제가 너무 좋지 않았습니다. 실제로 나는 7 ~ 8 개의 객체를 완전히 분리하여 만들지 만, 전부 또는 아닙니다. 한 부분이 실패하면 전체 트랜잭션이 실패해야합니다. 따라서 UserStatus 객체가 성공적으로 생성되었음을 알기 전에 User 객체를 커밋 할 수 없습니다. – Trent