SlideShare a Scribd company logo
회사에서 써보는 SQLAlchemy
        김재석
저는 이런 사람입니다.

‣   (주)스포카 공동창업자 / 기술 총괄

‣   도도포인트 서비스 개발중

    ‣   쉽고 빠른 적립, 스마트한 고객관리

    ‣   300여개 매장 이용 중

    ‣   http://dodopoint.com/
SQLAlchemy 소개
이게 뭔가요.




‣   The Python SQL Toolkit and
    Object Relational Mapper

‣   http://www.sqlalchemy.org/
뭐가 좋은가요.


‣   Function-based query construction

‣   Framework independent

‣   High Performing Architecture

‣   Non-Opinionated
이렇게들 쓰고 있습니다.
현업에서의 장점?
SQLAlchemy in Spoqa


‣   첫 서비스 개발(2011.02)부터 이용

‣   PostgreSQL에 물려서 쓰고 있음

‣   처음에 MySQL이었다가 변경

‣   개발팀 6명 중 4명은 회사에서 처음 접함
실전에서 부각되는
SQLAlchemy의 장점들

‣   복잡한 쿼리도 만들 수 있다!

‣   DBA의 엄격한 설계 기준 맞추기

‣   웹서비스 아닌 곳에서 ORM 쓰기

‣   쌩판 처음 보는 테이블에 ORM 씌우기
Django ORM
class Manufacturer(models.Model):
    name = models.CharField(max_length=30)

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer,
                                     related_name='cars')
    name = models.CharField(max_length=30)




SQLAlchemy
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, backref

class Manufacturer(Base):
    __tablename__ = 'manufacturers'
    id = Column(Integer, primary_key=True)
    name = Column(String(30))

class Car(models.Model):
    __tablename__ = 'cars'
    id = Column(Integer, primary_key=True)
    manufacturer_id = Column(Integer, ForeignKey('manufacturers.id'))
    name = Column(String(30))

      manufacturer = relationship('Manufacturer', backref=
          backref('cars', lazy='dynamic'))

http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/
어려워 보이는데요?

‣   다른 ORM보다는 써야 할 것이 더 많은 편

‣   하지만 회사처럼 장기적으로 제품을 개발해야 할 때
    는 이러한 유연성이 문제 해결에 도움을 줌

    ‣   ORM이 자체적인 룰을 많이 가지고 그에 기반하여 스키마가
        구성되면, 프로젝트 전체가 그 ORM에 의존하게 되어 막장이
        될 수 있음
저희는 이럴 때 좋았어요.

‣   LBS 법 때문에 위치 정보를 암호화해야 했음

‣   기존 코드가 암호화하지 않은 위치정보를 다양히 참
    조하여 꽤 큰 작업이 될 수도 있었음

‣   Hybrid Attributes 이용해 기존 코드를 거의 고치지
    않고 저장 정보를 암호화함

    ‣   http://spoqa.github.com/2011/12/10/sqlalchemy-hybrid-
        attributes.html
hybrid property 정의
    @hybrid_property
    def lat(self):
        return float(aes_decrypt(self.encrypted_lat))

    @lat.expression
    def lat(cls):
        decrypted = expr.func.aes_decrypt(
            expr.func.unhex(cls.encrypted_lat), aes_key)
        return cast(decrypted, db.Float(25))

    @lat.setter
    def lat(self, value):
        self.encrypted_lat = aes_encrypt(str(value)[:16])


써보면...
>>> Place.query.filter(Place.lat - 37.52 > 0.01).count()
2011-12-10 02:26:57,731 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM ...
FROM place
WHERE aes_decrypt(unhex(place.encrypted_lat), %s) - %s > %s) AS anon_1
2011-12-10 02:26:57,731 INFO sqlalchemy.engine.base.Engine ('1234567890123456',
37.520000000000003, 0.01)
8L
>>>
도입시 고민할 것들
교육

‣   일반적인 SQL 문법정도는 미리 알고 시작하세요.

‣   스터디의 99%는 공식 사이트의 문서로!

    ‣   처음엔 순서도 뒤죽박죽이고 알기 어려웠는데,
        점점 보기 좋아지고 있어요.

    ‣   Flask-SQLAlchemy를 쓰신다면
        해당 라이브러리의 튜토리얼도 아주 좋습니다.
이거 보지 마세요.
DB Migration


‣   과거엔 sqlalchemy-migrate를 많이 썼어요.

‣   근데 이거 문제가 좀 있어요.

    ‣   http://blog.dahlia.kr/post/8153601295

‣   그리고 불편해요.
alembic

‣   A new database migrations tool,
    written by the author of SQLAlchemy

‣   Full support for transactional DDL

‣   "auto generation" of migrations

‣   저희도 이번에 옮겨요. 많이 안정화 됐다길래...
정리
정리
‣   복잡한 쿼리 작성과 처리가 어려운 예외 상황에 부딪
    혀 ORM에 치를 떨고 계신 분들, 어서오세요.

‣   여러 회사에서 적극적으로 쓰고 있으니 0.x라고 두려
    워 마시고 시도해보셔도 좋아요.

‣   교육은 공식 문서로. 오라일리북은 피하시고...

‣   마이그레이션은 sqlalchemy-migrate가 많이 쓰여왔
    으나 alembic을 시도해보세요.
감사합니다.

More Related Content

ODP
Django와 flask
Jiho Lee
 
PDF
Laravel 로 배우는 서버사이드 #4
성일 한
 
PPTX
플라스크 템플릿
Thomas Hyunsik Kim
 
PDF
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
성일 한
 
PDF
처음배우는 자바스크립트, 제이쿼리 #1
성일 한
 
PDF
Django, 저는 이렇게 씁니다.
Kyoung Up Jung
 
PDF
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
Kwangyoun Jung
 
PPTX
Django View Part 1
Joong Hyeon Kim
 
Django와 flask
Jiho Lee
 
Laravel 로 배우는 서버사이드 #4
성일 한
 
플라스크 템플릿
Thomas Hyunsik Kim
 
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
성일 한
 
처음배우는 자바스크립트, 제이쿼리 #1
성일 한
 
Django, 저는 이렇게 씁니다.
Kyoung Up Jung
 
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
Kwangyoun Jung
 
Django View Part 1
Joong Hyeon Kim
 

What's hot (20)

PDF
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
Sang-ho Choi
 
PDF
테스트가 뭐예요?
Kyoung Up Jung
 
PDF
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
Kwangyoun Jung
 
PDF
Django를 Django답게, Django로 뉴스 사이트 만들기
Kyoung Up Jung
 
PPTX
ECMAScript 6의 새로운 것들!
WooYoung Cho
 
PPT
자바야 놀자 PPT
JinKyoungHeo
 
PDF
처음배우는 자바스크립트, 제이쿼리 #3
성일 한
 
PDF
안드로이드 개발자를 위한 스위프트
병한 유
 
PPTX
Web Components 101 polymer & brick
yongwoo Jeon
 
PDF
Django admin site 커스텀하여 적극적으로 활용하기
영우 박
 
PDF
처음배우는 자바스크립트, 제이쿼리 #4
성일 한
 
PPTX
Angular2 router&http
Dong Jun Kwon
 
PDF
Light Tutorial Django
Kwangyoun Jung
 
PPTX
Angular2 가기전 Type script소개
Dong Jun Kwon
 
PPT
헷갈리는 자바스크립트 정리
은숙 이
 
PPTX
4-1. javascript
JinKyoungHeo
 
PPTX
파이썬 플라스크 이해하기
Yong Joon Moon
 
PDF
Django로 쇼핑몰 만들자
Kyoung Up Jung
 
PDF
Django in Production
Hyun-woo Park
 
PDF
Javascript 101
Sungwoo Choo
 
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
Sang-ho Choi
 
테스트가 뭐예요?
Kyoung Up Jung
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
Kwangyoun Jung
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Kyoung Up Jung
 
ECMAScript 6의 새로운 것들!
WooYoung Cho
 
자바야 놀자 PPT
JinKyoungHeo
 
처음배우는 자바스크립트, 제이쿼리 #3
성일 한
 
안드로이드 개발자를 위한 스위프트
병한 유
 
Web Components 101 polymer & brick
yongwoo Jeon
 
Django admin site 커스텀하여 적극적으로 활용하기
영우 박
 
처음배우는 자바스크립트, 제이쿼리 #4
성일 한
 
Angular2 router&http
Dong Jun Kwon
 
Light Tutorial Django
Kwangyoun Jung
 
Angular2 가기전 Type script소개
Dong Jun Kwon
 
헷갈리는 자바스크립트 정리
은숙 이
 
4-1. javascript
JinKyoungHeo
 
파이썬 플라스크 이해하기
Yong Joon Moon
 
Django로 쇼핑몰 만들자
Kyoung Up Jung
 
Django in Production
Hyun-woo Park
 
Javascript 101
Sungwoo Choo
 
Ad

Similar to 회사에서 써보는 SQLAlchemy (20)

PPTX
The roadtocodecraft
bbongcsu
 
PDF
파이썬 데이터베이스 연결 2탄
SeongHyun Ahn
 
PPT
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
Kenu, GwangNam Heo
 
PDF
[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여
Kwangsung Ha
 
PDF
Fundamentals of Oracle SQL
JAEGEUN YU
 
PDF
(OkdevTV) 2024년 10월 30일 개발 이야기
Jay Park
 
PDF
Laravel로 스타트업 기술 스택 구성하기
KwangSeob Jeong
 
PPTX
Clean code
bbongcsu
 
PPTX
Basic Django ORM
Ayun Park
 
PDF
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
Chris Ohk
 
PDF
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
NAVER D2
 
PDF
예비 개발자를 위한 소프트웨어 세상 이야기
SU BO KIM
 
PDF
실전 DataSnap!
Devgear
 
PPTX
About Visual C++ 10
흥배 최
 
PDF
좌충우돌 ORM 개발기 2012 DAUM DEVON
Younghan Kim
 
PDF
[Pgday.Seoul 2019] Advanced FDW
PgDay.Seoul
 
PPTX
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
중선 곽
 
PPTX
분석과 설계
Haeil Yi
 
PDF
Cloudera session seoul - Spark bootcamp
Sang-bae Lim
 
PPTX
05. 아키텍트가 알아야할 12 97가지
YoungSu Son
 
The roadtocodecraft
bbongcsu
 
파이썬 데이터베이스 연결 2탄
SeongHyun Ahn
 
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
Kenu, GwangNam Heo
 
[강연] 학생에서 현업 개발자로의 성공적인 변신을 위하여
Kwangsung Ha
 
Fundamentals of Oracle SQL
JAEGEUN YU
 
(OkdevTV) 2024년 10월 30일 개발 이야기
Jay Park
 
Laravel로 스타트업 기술 스택 구성하기
KwangSeob Jeong
 
Clean code
bbongcsu
 
Basic Django ORM
Ayun Park
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
Chris Ohk
 
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
NAVER D2
 
예비 개발자를 위한 소프트웨어 세상 이야기
SU BO KIM
 
실전 DataSnap!
Devgear
 
About Visual C++ 10
흥배 최
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
Younghan Kim
 
[Pgday.Seoul 2019] Advanced FDW
PgDay.Seoul
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
중선 곽
 
분석과 설계
Haeil Yi
 
Cloudera session seoul - Spark bootcamp
Sang-bae Lim
 
05. 아키텍트가 알아야할 12 97가지
YoungSu Son
 
Ad

회사에서 써보는 SQLAlchemy

  • 2. 저는 이런 사람입니다. ‣ (주)스포카 공동창업자 / 기술 총괄 ‣ 도도포인트 서비스 개발중 ‣ 쉽고 빠른 적립, 스마트한 고객관리 ‣ 300여개 매장 이용 중 ‣ http://dodopoint.com/
  • 4. 이게 뭔가요. ‣ The Python SQL Toolkit and Object Relational Mapper ‣ http://www.sqlalchemy.org/
  • 5. 뭐가 좋은가요. ‣ Function-based query construction ‣ Framework independent ‣ High Performing Architecture ‣ Non-Opinionated
  • 8. SQLAlchemy in Spoqa ‣ 첫 서비스 개발(2011.02)부터 이용 ‣ PostgreSQL에 물려서 쓰고 있음 ‣ 처음에 MySQL이었다가 변경 ‣ 개발팀 6명 중 4명은 회사에서 처음 접함
  • 9. 실전에서 부각되는 SQLAlchemy의 장점들 ‣ 복잡한 쿼리도 만들 수 있다! ‣ DBA의 엄격한 설계 기준 맞추기 ‣ 웹서비스 아닌 곳에서 ORM 쓰기 ‣ 쌩판 처음 보는 테이블에 ORM 씌우기
  • 10. Django ORM class Manufacturer(models.Model): name = models.CharField(max_length=30) class Car(models.Model): manufacturer = models.ForeignKey(Manufacturer, related_name='cars') name = models.CharField(max_length=30) SQLAlchemy from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship, backref class Manufacturer(Base): __tablename__ = 'manufacturers' id = Column(Integer, primary_key=True) name = Column(String(30)) class Car(models.Model): __tablename__ = 'cars' id = Column(Integer, primary_key=True) manufacturer_id = Column(Integer, ForeignKey('manufacturers.id')) name = Column(String(30)) manufacturer = relationship('Manufacturer', backref= backref('cars', lazy='dynamic')) http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/
  • 11. 어려워 보이는데요? ‣ 다른 ORM보다는 써야 할 것이 더 많은 편 ‣ 하지만 회사처럼 장기적으로 제품을 개발해야 할 때 는 이러한 유연성이 문제 해결에 도움을 줌 ‣ ORM이 자체적인 룰을 많이 가지고 그에 기반하여 스키마가 구성되면, 프로젝트 전체가 그 ORM에 의존하게 되어 막장이 될 수 있음
  • 12. 저희는 이럴 때 좋았어요. ‣ LBS 법 때문에 위치 정보를 암호화해야 했음 ‣ 기존 코드가 암호화하지 않은 위치정보를 다양히 참 조하여 꽤 큰 작업이 될 수도 있었음 ‣ Hybrid Attributes 이용해 기존 코드를 거의 고치지 않고 저장 정보를 암호화함 ‣ http://spoqa.github.com/2011/12/10/sqlalchemy-hybrid- attributes.html
  • 13. hybrid property 정의 @hybrid_property def lat(self): return float(aes_decrypt(self.encrypted_lat)) @lat.expression def lat(cls): decrypted = expr.func.aes_decrypt( expr.func.unhex(cls.encrypted_lat), aes_key) return cast(decrypted, db.Float(25)) @lat.setter def lat(self, value): self.encrypted_lat = aes_encrypt(str(value)[:16]) 써보면... >>> Place.query.filter(Place.lat - 37.52 > 0.01).count() 2011-12-10 02:26:57,731 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1 FROM ... FROM place WHERE aes_decrypt(unhex(place.encrypted_lat), %s) - %s > %s) AS anon_1 2011-12-10 02:26:57,731 INFO sqlalchemy.engine.base.Engine ('1234567890123456', 37.520000000000003, 0.01) 8L >>>
  • 15. 교육 ‣ 일반적인 SQL 문법정도는 미리 알고 시작하세요. ‣ 스터디의 99%는 공식 사이트의 문서로! ‣ 처음엔 순서도 뒤죽박죽이고 알기 어려웠는데, 점점 보기 좋아지고 있어요. ‣ Flask-SQLAlchemy를 쓰신다면 해당 라이브러리의 튜토리얼도 아주 좋습니다.
  • 17. DB Migration ‣ 과거엔 sqlalchemy-migrate를 많이 썼어요. ‣ 근데 이거 문제가 좀 있어요. ‣ http://blog.dahlia.kr/post/8153601295 ‣ 그리고 불편해요.
  • 18. alembic ‣ A new database migrations tool, written by the author of SQLAlchemy ‣ Full support for transactional DDL ‣ "auto generation" of migrations ‣ 저희도 이번에 옮겨요. 많이 안정화 됐다길래...
  • 20. 정리 ‣ 복잡한 쿼리 작성과 처리가 어려운 예외 상황에 부딪 혀 ORM에 치를 떨고 계신 분들, 어서오세요. ‣ 여러 회사에서 적극적으로 쓰고 있으니 0.x라고 두려 워 마시고 시도해보셔도 좋아요. ‣ 교육은 공식 문서로. 오라일리북은 피하시고... ‣ 마이그레이션은 sqlalchemy-migrate가 많이 쓰여왔 으나 alembic을 시도해보세요.