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

회사에서 써보는 SQLAlchemy

  • Upload
    jc-kim

  • View
    3.030

  • Download
    8

Embed Size (px)

DESCRIPTION

 

Citation preview

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

감사합니다.