Top Banner
회사에서 써보는 SQLAlchemy 김재석
21

회사에서 써보는 SQLAlchemy

Dec 18, 2014

Download

Technology

Jc Kim

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 회사에서 써보는 SQLAlchemy

회사에서 써보는 SQLAlchemy

김재석

Page 2: 회사에서 써보는 SQLAlchemy

저는 이런 사람입니다.

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

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

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

‣ 300여개 매장 이용 중

‣ http://dodopoint.com/

Page 3: 회사에서 써보는 SQLAlchemy

SQLAlchemy 소개

Page 4: 회사에서 써보는 SQLAlchemy

이게 뭔가요.

‣ The Python SQL Toolkit and

Object Relational Mapper

‣ http://www.sqlalchemy.org/

Page 5: 회사에서 써보는 SQLAlchemy

뭐가 좋은가요.

‣ Function-based query construction

‣ Framework independent

‣ High Performing Architecture

‣ Non-Opinionated

Page 6: 회사에서 써보는 SQLAlchemy

이렇게들 쓰고 있습니다.

Page 7: 회사에서 써보는 SQLAlchemy

현업에서의 장점?

Page 8: 회사에서 써보는 SQLAlchemy

SQLAlchemy in Spoqa

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

‣ PostgreSQL에 물려서 쓰고 있음

‣ 처음에 MySQL이었다가 변경

‣ 개발팀 6명 중 4명은 회사에서 처음 접함

Page 9: 회사에서 써보는 SQLAlchemy

실전에서 부각되는 SQLAlchemy의 장점들

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

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

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

‣ 쌩판 처음 보는 테이블에 ORM 씌우기

Page 10: 회사에서 써보는 SQLAlchemy

from sqlalchemy import Column, Integer, String, ForeignKeyfrom 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'))

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)

Django ORM

SQLAlchemy

http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/

Page 11: 회사에서 써보는 SQLAlchemy

어려워 보이는데요?

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

‣ 하지만 회사처럼 장기적으로 제품을 개발해야 할 때

는 이러한 유연성이 문제 해결에 도움을 줌

‣ ORM이 자체적인 룰을 많이 가지고 그에 기반하여 스키마가

구성되면, 프로젝트 전체가 그 ORM에 의존하게 되어 막장이

될 수 있음

Page 12: 회사에서 써보는 SQLAlchemy

저희는 이럴 때 좋았어요.

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

‣ 기존 코드가 암호화하지 않은 위치정보를 다양히 참

조하여 꽤 큰 작업이 될 수도 있었음

‣ Hybrid Attributes 이용해 기존 코드를 거의 고치지

않고 저장 정보를 암호화함

‣ http://spoqa.github.com/2011/12/10/sqlalchemy-hybrid-

attributes.html

Page 13: 회사에서 써보는 SQLAlchemy

@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_12011-12-10 02:26:57,731 INFO sqlalchemy.engine.base.Engine ('1234567890123456', 37.520000000000003, 0.01)8L>>>

hybrid property 정의

써보면...

Page 14: 회사에서 써보는 SQLAlchemy

도입시 고민할 것들

Page 15: 회사에서 써보는 SQLAlchemy

교육

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

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

‣ 처음엔 순서도 뒤죽박죽이고 알기 어려웠는데,

점점 보기 좋아지고 있어요.

‣ Flask-SQLAlchemy를 쓰신다면

해당 라이브러리의 튜토리얼도 아주 좋습니다.

Page 16: 회사에서 써보는 SQLAlchemy

이거 보지 마세요.

Page 17: 회사에서 써보는 SQLAlchemy

DB Migration

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

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

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

‣ 그리고 불편해요.

Page 18: 회사에서 써보는 SQLAlchemy

alembic

‣ A new database migrations tool,

written by the author of SQLAlchemy

‣ Full support for transactional DDL

‣ "auto generation" of migrations

‣ 저희도 이번에 옮겨요. 많이 안정화 됐다길래...

Page 19: 회사에서 써보는 SQLAlchemy

정리

Page 20: 회사에서 써보는 SQLAlchemy

정리

‣ 복잡한 쿼리 작성과 처리가 어려운 예외 상황에 부딪

혀 ORM에 치를 떨고 계신 분들, 어서오세요.

‣ 여러 회사에서 적극적으로 쓰고 있으니 0.x라고 두려

워 마시고 시도해보셔도 좋아요.

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

‣ 마이그레이션은 sqlalchemy-migrate가 많이 쓰여왔

으나 alembic을 시도해보세요.

Page 21: 회사에서 써보는 SQLAlchemy

감사합니다.