2015. 2. 6. 09:00ㆍProgramming/python
요즘 대부분의 python 업무를 Django로 진행하여서 ORM을 따로 신경쓰지 않아도 됐었는데,
때마침 기존 python script에서 DB를 호출해서 사용해야 할 업무가 생겨났다.
JAVA 같은 경우에는 mybatis라는 좋은 ORM 도구가 있는데, 과연 python에도 이렇게 쓸 수 있는게 있을까?
열심히 구글링 하였고 예전부터 많이 들어보았던 SQLAlchemy를 사용하게 되었다.
기존 ORM과 그리 크게 다르지 않으며, 좀 더 이해를 쉽게 하기 위해 Model부분, database부분, controller부분 이렇게
세 부분으로 나누어 봤다.
일단 sqlalchemy를 사용하기 위해서는 sqlalchemy를 설치해야 한다.
pip install sqlalchemy
만약 데이터베이스로 mysql을 사용할 것이라면 아래와 같이 mysql 패키지를 설치해 준다. 만약 다른 DB라면 그에 맞는
패키지를 설치해 줘야 할 것이다.
$> sudo apt-get install python-mysqldb
$> pip install mysql-python
환경 설정이 끝나면 이제 database 연결을 위한 스크립트를 작성해준다.
create_engine을 통해 해당 DB로 접속이 가능하도록 engine을 생성한다.
접속형태는 id:password@databasename 이 형태로 매개변수를 넘겨주면 된다.
각 데이터베이스별 설정 url은 아래 링크에 자세히 나와있다.
http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html
접속이 끝나더라도 계속 해서 연결 상태를 유지시키기 위해 session_maker를 통해 세션을 만들어 준다.
scoped_session은 Thread_safe를 유지하기 위해 주로 웹 어플리케이션에서 사용한다.
새로운 Table과 mapper를 만들기 위해 declarative_base()를 호출하여 Base를 생성하고, 생성된 Base의 메타데이터를
해당하는 model의 값으로 생성한다.
DB 연결과 세션 생성에 대한 스크립트가 완료되었다. 이제는 model을 매핑하는 스크립트를 작성해야 한다.
models.py
Test라는 table에 대하여 각 column별 매핑을 한 script이다.
__init__ 함수는 이 클래스를 생성했을때 제일 먼저 실행되는 함수이며, 파라미터로 datetime과 string 값을 받는다.
__repr__은 해당 클래스에 대해 string 값으로 대표되는 값을 표현해준다.
이제 이렇게 완성된 ORM 매핑에 대해 실제 코드에서 어떻게 호출하는지를 살펴보자.
show_tables()는 TbTest라는 테이블 안에 들어있는 모든 레코드의 id와 datetime, string 값을 출력해준다.
add_entry는 TbTest에 레코드 하나를 추가하는 역할을 하며 delete_entry는 해당하는 레코드를 삭제하는 역할을 한다.
delete 시 filter를 사용하기 때문에 조건에 해당하는 모든 레코드를 삭제한다.
db 사용이 끝났으면 db_session.close()를 통해 해당 세션을 닫아준다.