-
아무리해도 우분투에서 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
'2017년 > Python' 카테고리의 다른 글
파이썬으로 옵저버 패턴을 구현해보자 (0) 2017.09.14 옵저버 패턴(observer pattern) 개요 (0) 2017.09.12 파이썬의 예외처리에 대해서 (0) 2017.09.03 python에서 다른 폴더에 있는 파일 import 시키는방법 (0) 2017.07.11 python에서 딕셔너리형 파일 읽고쓰고 원하는 데이터 출력 (0) 2017.07.06