python orm sqlalchemy를 써보자[1.1.x]기준 1부
아무리해도 우분투에서 1.2가 안깔린다..개발단계라 그런건지..그래서 1.1버전으로 했다.
우선 잘 정리된 문서를 원한다면... -->>> http://docs.sqlalchemy.org/en/rel_1_1/orm/tutorial.html
추가 알게된 내용을 노란색 박스안에 적어보겠다 (7/20)
orm의 컨셉은 identity map 이라서 모든 처리들이 실제 데이터셋과 함께 동작
[1] 버전 체크
[2] 연결하기
-echo를 true로 설정하면 쿼리문을 보여준다 (나는 개인적으로 좋았음)
사실 이때 바로 연결되는게 아니라 후에 db에 작업을 수행하라는 메시지가 처음 나올때 발생함 -> 게으른 연결
[3] 매핑 선언
-orm을 사용할 때 구성 프로세스는 처리 할 db table을 설명하고 해당 테이블에 매핑될 자체 클래스를 정의함으로써 시작
이 예제는 테이블이 아직 생성 되지 않은 것!! --> Base.metadata.create_all(engine)으로 해야 생성이 되는것
1.:.__tablename__에 정의한 테이블에 맵핑되는것
2.이 class에 def __init__():, def __repr__(), 와 같이 메서드를 계속 만들 수 있음
3.원래는 meta data를 만들고 클래스에 매핑해서 썻는데 이걸 classical mapping 이라고 해서 구방식이라고 한다.
User.__table __: metadata 정보
User.__mapper__: mapper 클래스
로 정보를 볼 수 있음
[4] 스키마 생성
-metadata.creat_all(Engine)을 이용해서 테이블을 설명해줄 스키마를 생성
그럼 이부분이 스키마 생성이 아니라 위에서 스키마를 생성했던거고 이 [4]부분은 테이블을 생성하는거였다!
[5] mapped Class의 인스턴스 생성
-class로 선언한 user의 인스턴스를 생성
DB와 대화할 준비 완료!
[1] 세션만들기
-세션은 DB에 대한 처리를 해줌
데이터베이스와 대화가 필요할때 session을 불러서 쓰는것
session 은 내부적으로 맵구조라서 세션의 반환값은 기존에 집어넣은 인스턴스 구조와 동일
[2] 객체의 추가/수정
-추가
위에서 생성했던 인스턴스를 세션의 함수인 add로 넘김
-filter
필터로 쿼리문을 날려서 결과를 얻어낼 수 있음
-------------------------------------------------7월 20일 추가내용---------------------------------------------------------------
-새로 추가한 친구들은 session.new 로 알 수 있다.
-수정은 그냥 객체 접근해서 변경해주면 됨
ed_user.name='test'
.add를 했어도 실제로 db에 추가된게 아니라 pending된(계류된) 상태 실제로 넣을땐 flush라는 과정을 통해 입력된다.
디비에 쿼리를 하면 pending data 는 flush 되어 접근가능한상태지만 실제로 저장된건 아니고 여전히 pending
pendingehls 친구들을 실행시키려면 session.commit() 이러면 모든 트랜잭션이
-객체는 실제 디비에 저장되기전까지 객체 상태를 가지고있다(pending도 포함)
1.transient : 세션에 없고 디비에 저장되지 않고 mapper()를 가지는 인스턴스
2.peristent : 세션에 있고 디비에 레코드가 있는 인스턴스
3.deleted : 트랜잭션이 아직 완료되지 않은 상태로 peding 상태와 반대..
4.detached : 디비 레코드와 일치하거나 이전에 대응했지만 현재 어떤 세션에도 없는 인스턴스
[3]rollback
변경하기전의 단계로 돌아간다.
session.rollback()
[4] 쿼리보내기
session.query()로 생성할 수 있음
[예제들] http://docs.sqlalchemy.org/en/rel_1_1/orm/tutorial.html#querying
for instance in session.query(User).order_by(User.id):
print instance.name, instance.fullname
for row in session.query(User, User.name).all():
print row.User, row.name
for row in session.query(User.name.label('name_label')).all():
print row.name_label
from sqlalchemy.orm import aliased
user_alias = aliased(User, name='user_alias')
for row in session.query(user_alias, user_alias.name).all():
print row.user_alias
for user in session.query(User).order_by(User.id)[1:3]:
print user
for name in session.query(User.name).filter_by(fullname='Edward Kim'):
print name
for name in session.query(User.name).filter(User.fullname=='Edward Kim'):
print name
for name in session.query(User).\
filter(User.name=='haruair').\
filter(User.fullname=='Edward Kim'):
print user
츌처url