Python 및 객체 관계형 맵에 대해 알아야 할 모든 것

Python 및 객체 관계형 맵에 대해 알아야 할 모든 것

객체 관계형 매핑(ORM)에 대해 들어본 적이 있을 것입니다. 당신은 하나를 사용했을 수도 있지만 정확히 무엇입니까? 그리고 파이썬에서 어떻게 사용합니까?





ORM과 Python에 대해 알아야 할 모든 것이 있습니다.





ORM이란 무엇입니까?

ORM(객체 관계형 매핑)은 데이터베이스에 액세스하는 데 사용되는 프로그래밍 기술입니다. 데이터베이스를 일련의 개체에 노출합니다. 데이터를 삽입하거나 검색하기 위해 SQL 명령을 작성할 필요가 없으며 개체에 연결된 일련의 속성과 메서드를 사용합니다.





복잡하고 불필요하게 들릴 수 있지만 많은 시간을 절약하고 데이터베이스에 대한 액세스를 제어하는 ​​데 도움이 됩니다.

여기 예가 있습니다. 웹사이트 비밀번호 보안에 설명된 대로 데이터베이스에 비밀번호를 삽입할 때마다 해시를 원한다고 말합니다. 이것은 간단한 사용 사례에서는 문제가 되지 않습니다. 삽입하기 전에 계산을 수행합니다. 그러나 코드의 여러 위치에 레코드를 삽입해야 하는 경우에는 어떻게 해야 합니까? 다른 프로그래머가 당신의 테이블에 삽입하는데 당신이 그것에 대해 모른다면?



ORM을 사용하면 데이터베이스의 행이나 필드에 액세스할 때마다 언제 어디서나 다른 사용자 정의 코드가 먼저 실행되도록 코드를 작성할 수 있습니다.

이것은 또한 '단일 소스 소스' 역할을 합니다. 사용자 지정 계산을 변경하려면 여러 곳이 아닌 한 곳에서만 변경하면 됩니다. 다음과 같은 많은 원칙을 수행할 수 있습니다. Python의 객체 지향 프로그래밍(OOP) 그러나 ORM은 OOP 원칙과 함께 작동하여 데이터베이스에 대한 액세스를 제어합니다.





ORM을 사용할 때 주의해야 할 사항이 있고 사용하고 싶지 않은 상황이 있지만 일반적으로 특히 큰 코드베이스에서는 좋은 것으로 간주됩니다.

SQLAlchemy를 사용하는 Python의 ORM

Python의 많은 작업과 마찬가지로 모듈을 직접 작성하는 것보다 모듈을 가져오는 것이 더 빠르고 쉽습니다. 물론 자신만의 ORM을 작성하는 것도 가능하지만 바퀴를 재발명하는 이유는 무엇입니까?





다음 예제는 모두 사용 SQLAlchemy , 인기 있는 Python ORM이지만 구현에 관계없이 많은 원칙이 적용됩니다.

SQLAlchemy용 Python 설정

바로 시작하기 전에 SQLAlchemy를 사용하여 Python 개발을 위해 머신을 설정해야 합니다.

이 예제를 따라 하려면 Python 3.6을 사용해야 합니다. 이전 버전이 작동하는 동안 아래 코드는 실행되기 전에 약간의 수정이 필요합니다. 차이점이 확실하지 않습니까? Python FAQ는 모든 차이점을 다룹니다.

코딩하기 전에 Python 환경을 설정해야 다른 가져온 Python 패키지의 문제를 방지할 수 있습니다.

당신이 가지고 있는지 확인 PIP, Python 패키지 관리자 최신 버전의 Python과 함께 제공됩니다.

준비가 되면 SQLAlchemy를 준비하는 것으로 시작할 수 있습니다. 명령줄의 Python 환경 내에서 다음을 사용하여 SQLAlchemy를 설치합니다. 핍 설치 명령:

pip install SQLAlchemy-1.2.9

NS 1.2.9 버전 번호입니다. 최신 패키지를 가져오기 위해 이 옵션을 그대로 둘 수 있지만 구체적으로 지정하는 것이 좋습니다. 언제 새 릴리스가 현재 코드를 손상시킬지 모릅니다.

이제 코딩을 시작할 준비가 되었습니다. Python 연결을 수락하도록 데이터베이스를 준비해야 할 수도 있지만 다음 예제에서는 모두 다음을 사용합니다. SQLite 아래의 인메모리에 생성된 데이터베이스.

SQLAlchemy의 모델

ORM의 핵심 구성 요소 중 하나는 모델 . 이것은 테이블의 모양과 작동 방식을 설명하는 Python 클래스입니다. ORM 버전입니다. 테이블 생성 SQL의 문. 데이터베이스의 각 테이블에 대한 모델이 필요합니다.

좋아하는 텍스트 편집기 또는 IDE를 열고 라는 새 파일을 만듭니다. test.py . 이 시작 코드를 입력하고 파일을 저장하고 실행합니다.

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('sqlite://') # Create the database in memory
Base.metadata.create_all(engine) # Create all the tables in the database

이 코드는 여러 가지 작업을 수행합니다. Python이 필요한 SQLAlchemy 모듈을 찾을 위치를 이해하려면 가져오기가 필요합니다. 귀하의 모델은 선언적_베이스 나중에 예상대로 작동하도록 새 모델을 구성합니다.

NS create_engine 메소드는 데이터베이스에 대한 새로운 연결을 생성합니다. 데이터베이스가 이미 있는 경우 변경해야 합니다. sqlite:// 당신의 데이터베이스 URI에. 그대로 이 코드는 메모리에만 새 데이터베이스를 만듭니다. 코드 실행이 완료되면 데이터베이스가 파괴됩니다.

마지막으로, create_all 메소드는 데이터베이스의 모드에 정의된 모든 테이블을 생성합니다. 아직 모델을 정의하지 않았으므로 아무 일도 일어나지 않습니다. 계속해서 이 코드를 실행하여 문제나 오타가 없는지 확인하십시오.

모델을 만들어 봅시다. 파일 상단에 다른 가져오기를 추가합니다.

from sqlalchemy import Column, Integer, String

이것은 수입 , 정수 , 그리고 SQLAlchemy의 모듈. 데이터베이스 테이블, 필드, 열 및 데이터 유형이 작동하는 방식을 정의합니다.

밑에 선언적_베이스 , 모델 클래스를 만듭니다.

class Cars(Base):
__tablename__ = 'cars'
id = Column(Integer, primary_key=True)
make = Column(String(50), nullable=False)
color = Column(String(50), nullable=False)

이 간단한 예에서는 자동차를 사용하지만 테이블에 모든 데이터가 포함될 수 있습니다.

각 클래스는 상속해야 합니다. 베이스 . 데이터베이스 테이블 이름은 다음에 정의되어 있습니다. __테이블 이름__ . 이것은 클래스 이름과 같아야 하지만 이것은 권장 사항일 뿐이며 일치하지 않으면 아무 것도 깨지지 않습니다.

마지막으로 각 열은 클래스 내에서 파이썬 변수로 정의됩니다. 다양한 데이터 유형이 사용되며, 기본_키 속성은 SQLAlchemy에 생성하도록 지시합니다. ID 열을 기본 키로 사용합니다.

계속해서 마지막 가져오기를 추가하세요. 이번에는 외래키 기준 치수. 당신의 옆에 이것을 추가하십시오 수입:

from sqlalchemy import Column, ForeignKey, Integer, String

이제 두 번째 모델 클래스를 만듭니다. 이 클래스는 자동차 소유자 , 에 저장된 특정 자동차의 소유자 세부 정보를 저장합니다. 자동차 테이블:

class CarOwners(Base):
__tablename__ = 'carowners'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
age = Column(Integer, nullable=False)
car_id = Column(Integer, ForeignKey('cars.id'))
car = relationship(Cars)

여기에 몇 가지 새로운 속성이 도입되었습니다. NS car_id 필드는 외래 키로 정의됩니다. 에 연결되어 있습니다. ID 에서 자동차 테이블. 대문자 클래스 이름 대신 소문자 테이블 이름이 어떻게 사용되는지 주목하십시오.

마지막으로 속성 자동차 로 정의된다 관계 . 이렇게 하면 모델이 액세스할 수 있습니다. 자동차 이 변수를 통해 테이블. 이것은 아래에 설명되어 있습니다.

지금 이 코드를 실행하면 아무 일도 일어나지 않는 것을 볼 수 있습니다. 아직 눈에 띄는 일을 하라고 지시하지 않았기 때문입니다.

SQLAlchemy의 개체

이제 모델이 생성되었으므로 개체에 액세스하고 데이터를 읽고 쓸 수 있습니다. 논리를 자체 클래스 및 파일에 배치하는 것이 좋지만 지금은 모델과 함께 유지될 수 있습니다.

데이터 쓰기

이 예에서는 데이터를 읽기 전에 데이터베이스에 일부 데이터를 삽입해야 합니다. 기존 데이터베이스를 사용하는 경우 이미 데이터가 있을 수 있습니다. 어느 쪽이든, 데이터를 삽입하는 방법을 아는 것은 여전히 ​​매우 유용합니다.

당신은 쓰기에 익숙 할 수 있습니다 끼워 넣다 SQL의 문. SQLAlchemy가 이를 처리합니다. 한 행을 삽입하는 방법은 다음과 같습니다. 자동차 모델. 에 대한 새 가져오기로 시작 세션메이커 :

from sqlalchemy.orm import sessionmaker

이것은 생성하는 데 필요합니다. 세션 그리고 DB세션 데이터를 읽고 쓰는 데 사용되는 객체:

DBSession = sessionmaker(bind=engine)
session = DBSession()

이제 이것을 아래에 두십시오. create_all 성명:

car1 = Cars(
make='Ford',
color='silver'
)
session.add(car1)
session.commit()

해당 코드를 분해해 보겠습니다. 변수 자동차1 에 기반한 객체로 정의됩니다. 자동차 모델. 그 제조사와 색상은 매개변수로 설정됩니다. 이것은 '나에게 차를 만들지 만 아직 데이터베이스에 쓰지 마십시오'라고 말하는 것과 같습니다. 이 차는 메모리에 존재하지만 쓰기를 기다리고 있습니다.

다음을 사용하여 세션에 자동차 추가 세션 추가 , 다음을 사용하여 데이터베이스에 씁니다. 세션.커밋 .

이제 소유자를 추가해 보겠습니다.

owner1 = CarOwners(
name='Joe',
age='99',
car_id=(car1.id)
)
session.add(owner1)
session.commit()

이 코드는 이전 삽입물과 거의 동일합니다. 자동차 모델. 여기서 가장 큰 차이점은 car_id 외래 키이므로 다른 테이블에 존재하는 행 ID가 필요합니다. 이것은 car1.id 재산.

SQLAlchemy가 이를 처리하므로 데이터베이스를 쿼리하거나 ID를 반환할 필요가 없습니다(데이터를 먼저 커밋하는 한).

데이터 읽기

일부 데이터를 작성한 후에는 다시 읽기를 시작할 수 있습니다. 쿼리하는 방법은 다음과 같습니다. 자동차 그리고 자동차 소유자 테이블:

result = session.query(Cars).all()

그것은 간단합니다. 를 사용하여 질문 에서 찾은 방법 세션 , 모델을 지정한 다음 모두 모든 결과를 검색하는 메서드입니다. 결과가 하나만 있다는 것을 알고 있다면 다음을 사용할 수 있습니다. 첫 번째 방법:

result = session.query(Cars).first()

모델을 쿼리하고 반환된 결과를 변수에 저장하면 객체를 통해 데이터에 액세스할 수 있습니다.

print(result[0].color)

해당 레코드가 첫 번째 행이므로 '은색' 색상이 인쇄됩니다. 원하는 경우 결과 개체를 반복할 수 있습니다.

모델에서 관계를 정의하면 조인을 지정하지 않고도 관련 테이블의 데이터에 액세스할 수 있습니다.

result = session.query(CarOwners).all()
print(result[0].name)
print(result[0].car.color)

모델에 테이블 구조에 대한 세부 정보가 포함되어 있고 자동차 속성은 에 대한 링크로 정의되었습니다. 자동차 테이블.

ORM에 대해 좋아하지 않는 것은 무엇입니까?

이 튜토리얼은 아주 기본적인 것만 다루었지만 일단 익숙해지면 고급 주제로 넘어갈 수 있습니다. ORM에는 몇 가지 잠재적인 단점이 있습니다.

  • 쿼리를 실행하려면 먼저 모델을 작성해야 합니다.
  • 배울 또 다른 새로운 구문입니다.
  • 단순한 요구 사항에는 너무 복잡할 수 있습니다.
  • 시작하려면 좋은 데이터베이스 디자인이 있어야 합니다.

이러한 문제는 그 자체로 큰 문제는 아니지만 주의해야 할 사항입니다. 기존 데이터베이스로 작업하는 경우 문제가 발생할 수 있습니다.

ORM이 당신에게 적합한 도구인지 확신이 서지 않는다면 다음을 읽어보십시오. 프로그래머가 알아야 할 중요한 SQL 명령 .

공유하다 공유하다 트위터 이메일 Windows 11로 즉시 업그레이드해야 합니까?

Windows 11이 곧 출시되지만 가능한 한 빨리 업데이트해야 합니까? 아니면 몇 주를 기다려야 합니까? 알아 보자.

다음 읽기
관련 항목
  • 프로그램 작성
  • 파이썬
  • SQL
  • 코딩 튜토리얼
저자 소개 조 코번(136건의 출판물)

Joe는 영국 링컨 대학교에서 컴퓨터 공학을 전공했습니다. 그는 전문 소프트웨어 개발자이며 드론을 날리거나 작곡을 하지 않을 때 종종 사진을 찍거나 동영상을 제작하는 모습을 볼 수 있습니다.

고통 자체는 고통의 산물이고 주고객은 편안하지만 일하는 시간만큼은 아낌없이 준다
조 코번이 참여한 작품 더보기

뉴스레터 구독

기술 팁, 리뷰, 무료 전자책 및 독점 거래에 대한 뉴스레터에 가입하십시오!

구독하려면 여기를 클릭하세요.