개발 일지
[flask] flask-sqlalchemy relationship 이해하기 본문
flask-sqlalchemy를 처음 사용할 당시 ORM 자체를 처음 사용해서인지 relationship이란 개념을 이해하기가 어려웠다.
해당 게시글은 relationship을 이해하기 위해 공식 docs의 일부분을 간단히 번역한 글이다.
공식 문서
https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/
Declaring Models — Flask-SQLAlchemy Documentation (2.x)
Declaring Models Generally Flask-SQLAlchemy behaves like a properly configured declarative base from the declarative extension. As such we recommend reading the SQLAlchemy docs for a full reference. However the most common use cases are also documented her
flask-sqlalchemy.palletsprojects.com
one-to-many relationships
가장 흔한 relationships은 one-to-many이다.
relationships은 그들이 설정되기 전에 선언되므로 당신은 string을 사용해 아직 생성되지 않은 클래스를 참조할 수 있다.
(예를 들어 만약 Person이 파일 뒷부분에 선언되는 Address와의 관계를 정의하는 경우)
relationships은 relationship() 함수로 표현된다. 하지만 foreign key는 ForeignKey 클래스로 분리되어 선언되어야한다.
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
addresses = db.relationship('Address', backref='person', lazy=True)
class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), nullable=False)
person_id = db.Column(db.Integer, db.ForeignKey('person.id'),
nullable=False)
db.relationship()이 무엇을 하는가?
db.relationship()은 다양한 것을 할 수 있는 새로운 property를 반환한다. 이 경우에 우리는 그것을 통해 Address를 가리키고 여러개의 address를 불러온다.
어떻게 이게 하나 이상의 address를 반환할 것이라고 알 수 있는가?
SQLAlchemy는 당신의 선언에서 유용한 기본값을 추측한다. 만약 당신이 one-to-one relationship를 사용하고 싶다면 당신은 relationship()에 uselist=False를 사용할 수 있다.
이름이 없는 person 혹은 연관된 address가 없는 email address는 성립되지 않기때문에, nullable=False 는 SQLAlchemy로 not null 컬럼을 만든다. 이것은 primary key 컬럼에 적용되어 있지만 당신의 코드를 작업하는 사람들에게 당신이 실제로 nullable 컬럼을 원했으며 잊지않고 추가했음을 명확하게 하기위해 다른 모든 컬럼에도 특정하는 것이 좋을 것이다.
그래서 backref가 무엇을 하며 lazy는 무슨 뜻인가?
backref는 address 클래스에 새로운 property를 선언하는 쉬운 방법이다. 당신은 또한 my_address.person을 사용하여 해당 address의 person을 알 수 있다. lazy는 SQLAlchemy가 언제 데이터베이스에서 데이터를 가져오는지 정의한다.
select / True (기본이지만 명시적인 것이 낫다)
SQLAlchemy가 표준 select문을 사용하여 필요한 데이터를 한번에 가져오는 것을 의미한다.
joined / False
SQLAlchemy가 join문을 사용하여 parent와 동일한 query에서 relationship을 가져오는 것을 말한다.
subquery
joined와 비슷하게 작동하지만 대신 SQLAlchemy가 subquery를 사용한다.
dynamic
당신이 많은 요소에게 항상 추가적인 sql 필터를 적용하길 원한다면 유용하다. 요소를 불러오는 대신 SQLAlchemy는 요소를 가져오기 전에 당신이 미래에 재정의할 수 있는 다른 query를 반환한다. 이것은 query를 할때 다른 가져오기 전략으로 바뀔 수 없기 때문에 lazy=True의 경우 사용하지 않는 것이 좋을 수도 있다는 것을 유의하자. 유동적인 user.addresses와 동일한 query 오브젝트는 계속 lazy를 사용할 수 있거나 필요에 따라 관계 자체에 로딩을 원할때 Address.query.with_parent(user)를 통해 생성된다.
어떻게 backrefs에 대한 lazy 상태를 정의하는가? backref() 함수를 사용한다
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
addresses = db.relationship('Address', lazy='select',
backref=db.backref('person', lazy='joined'))
lazy 이해하기
https://medium.com/@ns2586/sqlalchemys-relationship-and-lazy-parameter-4a553257d9ef
SQLAlchemy’s “Lazy” Parameter
SQLAlchemy is one of the object-relational mapping softwares — it lets us map python classes to SQL databases and allows us to talk to the…
medium.com
'back > flask' 카테고리의 다른 글
| [flask] blueprint (0) | 2020.10.06 |
|---|