문제

이미 기존 데이터베이스를 사용하고 SQLALCHEMY를 사용하여 액세스하고 싶습니다. 데이터베이스 구조는 다른 코드 (Django Orm, 실제로)에 의해 관리되고 모든 테이블 구조를 설명하고 싶지 않기 때문에 사용하고 있습니다. autoload 내성. 나는 간단한 콘크리트 테이블 상속에 붙어 있습니다.

Payment                FooPayment
  + id (PK) <----FK------+ payment_ptr_id (PK)
  + user_id              + foo
  + amount
  + date

다음은 테이블 SQL Descritions를 docstrings로 포함하는 코드입니다.

class Payment(Base):
    """
    CREATE TABLE payments(
      id serial NOT NULL,
      user_id integer NOT NULL,
      amount numeric(11,2) NOT NULL,
      date timestamp with time zone NOT NULL,
      CONSTRAINT payment_pkey PRIMARY KEY (id),
      CONSTRAINT payment_user_id_fkey FOREIGN KEY (user_id)
          REFERENCES users (id) MATCH SIMPLE)
    """
    __tablename__ = 'payments'
    __table_args__ = {'autoload': True}
    # user = relation(User)

class FooPayment(Payment):
    """
    CREATE TABLE payments_foo(
      payment_ptr_id integer NOT NULL,
      foo integer NOT NULL,
      CONSTRAINT payments_foo_pkey PRIMARY KEY (payment_ptr_id),
      CONSTRAINT payments_foo_payment_ptr_id_fkey
          FOREIGN KEY (payment_ptr_id)
          REFERENCES payments (id) MATCH SIMPLE)
    """
    __tablename__ = 'payments_foo'
    __table_args__ = {'autoload': True}
    __mapper_args__ = {'concrete': True}

실제 테이블에는 추가 열이 있지만 질문과는 전혀 관련이 없으므로 코드를 최소화하기 위해 모든 것을 핵심으로 단순화했습니다.

문제는 내가 이것을 실행할 때 :

payment = session.query(FooPayment).filter(Payment.amount >= 200.0).first()
print payment.date

결과 SQL은 의미가 없습니다 (결합 조건 부족에 주목하십시오) :

SELECT payments_foo.payment_ptr_id AS payments_foo_payment_ptr_id,
       ... /* More `payments_foo' columns and NO columns from `payments' */
    FROM payments_foo, payments
    WHERE payments.amount >= 200.0 LIMIT 1 OFFSET 0

그리고 내가 접근하려고 할 때 payment.date 다음 오류가 발생합니다. Concrete Mapper|FooPayment|payments_foo does not implement attribute u'date' at the instance level.

암시 적 외국 키 참조를 추가하려고 시도했습니다 id = Column('payment_ptr_id', Integer, ForeignKey('payments_payment.id'), primary_key=True) 에게 FooPayment 아무런 성공도없이. 견딜 수 없는 print session.query(Payment).first().user 작품 (나는 생략했다 User 클래스와 라인을 완벽하게 댓글을 달았으므로 FK 내성이 작동합니다.

간단한 쿼리를 어떻게 수행 할 수 있습니까? FooPayment 그리고 액세스 Payment결과 인스턴스의 값?

SQLALCHEMY 0.5.3, PostgreSQL 8.3, PSYCOPG2 및 Python 2.5.2를 사용하고 있습니다. 제안 해주셔서 감사합니다.

도움이 되었습니까?

해결책

테이블 구조는 조인트 테이블 상속에 사용되는 것과 유사하지만, 부모 클래스의 모든 필드가 서브 클래스 테이블에 복제되는 콘크리트 테이블 상속에 해당하지 않습니다. 지금은 부모보다 필드가 적고 부모 클래스의 인스턴스에 대한 참조가있는 서브 클래스가 있습니다. 조인트 테이블 상속으로 전환하십시오 (및 사용 FooPayment.amount 당신의 상태에서 또는 간단한 집계 (참조)에 찬성하여 상속을 포기하십시오.

다른 모델의 필드에 의한 필터는 조인 조건을 자동으로 추가하지 않습니다. 예제에 조인에 어떤 조건을 사용해야하는지 분명하지만 일반적으로 그러한 조건을 결정할 수는 없습니다. 그렇기 때문에 지불을 참조하는 관계 속성을 정의하고 사용해야합니다. has() 적절한 조인 조건을 얻는 필터의 메소드.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top