2017-09-15 3 views
0

필자는 작성된 사양에서 SQLAlchemy 코드를 생성하는 작은 도구를 작성했습니다. 이 도구는 다음과 같은 코드를 만들 수 있습니다SQLAlchemy 쿼리 결과에서 외래 키를 "확인"하는 방법은 무엇입니까?

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    address_id = db.Column(db.Integer, db.ForeignKey('address.id')) 

class Address(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(50)) 

내가, 내가 매력처럼 작동 할 수 그들을 조회 할 수 있습니다 새 레코드를 삽입 할 수 있습니다,하지만 난 정말 수동의 주소를 찾을 필요하지 싶습니다 사람.

Person 개체를 통해 특정 사람에게 속한 주소에 액세스 할 수 있기를 원합니다. 예제를 올바르게 이해했다면 이렇게 할 필요가 있습니다 (예 : http://flask-sqlalchemy.pocoo.org/2.1/models/#one-to-many-relationships).

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    address = db.relationship('Address', backref='person', 
           lazy='dynamic') 

class Address(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(50)) 
    person_id = db.Column(db.Integer, db.ForeignKey('person.id')) 

이 나는 ​​모든 주소에게 사람에 대한 "링크"를 제공해야하고 역 참조 그래서 나는 사람에 대한 주소를 가질 수 뒤로 나 모든 보인다? 사람에게서 직접 할 수 없습니까?

또한 코드를 작성하는 것이 훨씬 더 복잡하므로이를 피하고 싶습니다.

답변

1

첫 번째 예에서 Person은 정확히 하나의 주소를 가질 수 있지만 각 주소는 여러 사람이 사용할 수 있습니다. 두 번째 해결 방법 Person은 이제 여러 개의 주소를 가질 수 있지만 각 주소는 주어진 Person에만 고유합니다 (ForeignKey가 이동 된 테이블에 유의하십시오).

따라서 N : 1에서 1 : N으로 이동했습니다. 1면의 인스턴스가 아닌 N면의 목록을 원한다고 말하면 더 많은 것을 지정해야합니다.

+0

나는 그 이유를 묻는다. 내가 찾을 수있는 1 : 1 예제가 없으며 1 : N 예제 모두가 (나에게) 불필요한 역 참조가 진행되고 있습니다. 가능한 한 가장 쉬운 방법을 1 : 1하는 방법을 알고 싶습니다. 그래서 사람이있을 때 주소에 대한 두 번째 쿼리를 수행 할 필요가 없습니다. – ramdyne