2013-02-25 2 views
2

내 모델은 매우 복잡하며 기존 스토어드 프로 시저의 로직을 가져 와서 이식성을 위해 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() 

변경 엔진! 응용 프로그램이 고장났습니다.

방법에 대한 아이디어가 있으십니까? 이 메시지는 한 번에 수천 명의 사용자가 액세스하는 매우 높은 트랜잭션 응용 프로그램 일 수 있습니다.

+0

'UserStatuses'란 무엇입니까? 존재하지 않는 사용자 등으로 사용자 세션을 만들려고합니까? 트랜잭션 시작과 관련하여 잘못된 점은 무엇입니까? –

+0

당신의 솔루션은 훌륭합니다. 문제를 해결할 수있는 또 다른 옵션은 객체'user'와'status'를'UserStatuses' 생성자에 직접 넘기는 것입니다. 아직 'id'가 없더라도 세션은 모든 관계를 적절히 해결할 수 있습니다. – mtth

+0

스펜서, 불행히도 제 예제가 너무 좋지 않았습니다. 실제로 나는 7 ~ 8 개의 객체를 완전히 분리하여 만들지 만, 전부 또는 아닙니다. 한 부분이 실패하면 전체 트랜잭션이 실패해야합니다. 따라서 UserStatus 객체가 성공적으로 생성되었음을 알기 전에 User 객체를 커밋 할 수 없습니다. – Trent

답변

1

:

는 시퀀스 객체는 또한 "다음 값"함수를 호출하는 효과가있는 SQL 표현처럼 독립적으로 실행될 수있는 능력을 가지고 있습니다 커밋하기 전에 :

db.session.add(user) 
db.session.add(status) 
db.session.flush() 

을 다음 개체를 add() -ed는 status.idNone을하지 않습니다, 자신의 순서 열 (id가) 너무 user.id 업데이트 얻을 것이다 y 더.

+0

나는 ('13) 이후 당신이 위에서 언급 한 방식대로하기 시작했지만, 나는 여기에 답을 잊어 버렸다. – Trent

+0

올바른 방법으로 이것을 허용 된 답변으로 변경했습니다. – Trent

4

답변을 찾았습니다 - 왜 내가 전에 이것을 보지 못했는지 모릅니다! 당신은 모델 객체를 추가 한 후 세션을 플러시 그러나 경우

seq = Sequence('some_sequence') 
nextid = connection.execute(seq)