SQLAlchemy ORM-매핑 선언
SQLAlchemy의 Object Relational Mapper API의 주요 목적은 사용자 정의 Python 클래스를 데이터베이스 테이블과 연결하고 해당 클래스의 개체를 해당 테이블의 행과 쉽게 연결하는 것입니다. 개체 및 행의 상태 변경은 서로 동 기적으로 일치합니다. SQLAlchemy는 사용자 정의 클래스 및 정의 된 관계 측면에서 데이터베이스 쿼리를 표현할 수 있습니다.
ORM은 SQL 표현식 언어 위에 구성됩니다. 높은 수준의 추상적 인 사용 패턴입니다. 실제로 ORM은 Expression Language의 적용 용도입니다.
Object Relational Mapper를 사용하여 성공적인 응용 프로그램을 구성 할 수 있지만 ORM으로 구성된 응용 프로그램은 특정 데이터베이스 상호 작용이 필요한 경우 직접 Expression Language를 사용할 수 있습니다.
매핑 선언
먼저 create_engine () 함수를 호출하여 나중에 SQL 작업을 수행하는 데 사용되는 엔진 개체를 설정합니다. 이 함수에는 두 개의 인수가 있습니다. 하나는 데이터베이스 이름이고 다른 하나는 True로 설정하면 활동 로그를 생성하는 에코 매개 변수입니다. 존재하지 않는 경우 데이터베이스가 생성됩니다. 다음 예에서는 SQLite 데이터베이스가 생성됩니다.
from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)
Engine은 Engine.execute () 또는 Engine.connect ()와 같은 메서드가 호출 될 때 데이터베이스에 대한 실제 DBAPI 연결을 설정합니다. 그런 다음 엔진을 직접 사용하지 않는 SQLORM을 내보내는 데 사용됩니다. 대신 ORM에 의해 배후에서 사용됩니다.
ORM의 경우 구성 프로세스는 데이터베이스 테이블을 설명하고 해당 테이블에 매핑 될 클래스를 정의하여 시작됩니다. SQLAlchemy에서는이 두 작업이 함께 수행됩니다. 이것은 선언 시스템을 사용하여 수행됩니다. 생성 된 클래스에는 매핑 된 실제 데이터베이스 테이블을 설명하는 지시문이 포함됩니다.
기본 클래스는 선언 시스템에 클래스 및 매핑 된 테이블의 카탈로그를 저장합니다. 이를 선언적 기본 클래스라고합니다. 일반적으로 일반적으로 가져온 모듈에는이베이스의 인스턴스가 하나만 있습니다. declarative_base () 함수는 기본 클래스를 만드는 데 사용됩니다. 이 함수는 sqlalchemy.ext.declarative 모듈에 정의되어 있습니다.
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
일단 기본 클래스가 선언되면 그 관점에서 여러 매핑 된 클래스를 정의 할 수 있습니다. 다음 코드는 고객의 클래스를 정의합니다. 여기에는 매핑 할 테이블과 그 안에있는 열의 이름과 데이터 유형이 포함됩니다.
class Customers(Base):
__tablename__ = 'customers'
id = Column(Integer, primary_key = True)
name = Column(String)
address = Column(String)
email = Column(String)
Declarative의 클래스에는 __tablename__ 속성 및 하나 이상의 Column기본 키의 일부입니다. 선언적은 모든Column 특수 Python 접근자가있는 객체 descriptors. 이 프로세스는 SQL 컨텍스트에서 테이블을 참조하는 수단을 제공하고 데이터베이스에서 열 값을 유지하고로드 할 수 있도록하는 도구로 알려져 있습니다.
일반 Python 클래스와 같은이 매핑 된 클래스에는 요구 사항에 따라 속성과 메서드가 있습니다.
선언 시스템의 클래스에 대한 정보를 테이블 메타 데이터라고합니다. SQLAlchemy는 Table 개체를 사용하여 Declarative에서 만든 특정 테이블에 대한이 정보를 나타냅니다. Table 개체는 사양에 따라 생성되며 Mapper 개체를 구성하여 클래스와 연결됩니다. 이 매퍼 객체는 직접 사용되지 않고 매핑 된 클래스와 테이블 간의 인터페이스로 내부적으로 사용됩니다.
각 Table 개체는 MetaData라고하는 더 큰 컬렉션의 구성원이며이 개체는 .metadata선언적 기본 클래스의 속성. 그만큼MetaData.create_all()방법은 데이터베이스 연결 소스로 엔진을 전달하는 것입니다. 아직 생성되지 않은 모든 테이블에 대해 CREATE TABLE 문을 데이터베이스에 발급합니다.
Base.metadata.create_all(engine)
데이터베이스와 테이블을 생성하고 Python 클래스를 매핑하는 완전한 스크립트는 다음과 같습니다.
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Customers(Base):
__tablename__ = 'customers'
id = Column(Integer, primary_key=True)
name = Column(String)
address = Column(String)
email = Column(String)
Base.metadata.create_all(engine)
실행되면 Python 콘솔은 실행중인 SQL 표현식에 따라 에코됩니다.
CREATE TABLE customers (
id INTEGER NOT NULL,
name VARCHAR,
address VARCHAR,
email VARCHAR,
PRIMARY KEY (id)
)
SQLiteStudio 그래픽 도구를 사용하여 Sales.db를 열면 위에서 언급 한 구조로 내부 고객 테이블이 표시됩니다.