• python orm sqlalchemy를 써보자[1.1.x]기준 1부

    2017. 7. 9. 23:02

    by. 위지원

    아무리해도 우분투에서 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

    http://www.haruair.com/blog/1682