Coding/Python113 SQLAlchemy AsyncSession으로 비동기 적용하기 개요 현재 서버 프레임워크로 FastAPI를 사용하고 있었고 SQLAlchemy는 1.3대 버전을 사용중이었다. 따라서 DB쪽은 여전히 동기형태로 작업이 진행되기 때문에 비동기 프레임워크의 장점을 제대로 살리지 못했다. 물론 database, peewee등 비동기 ORM이 존재하지만 팀 내 구성원간의 러닝커브등을 고려하여 기존에 사용하던 SQLAlchemy를 그대로 사용중이었다. 하지만 SQLAlchemy 1.4버전부터 비동기 처리를 지원하기 시작했고 그에 따라 마이그레이션을 준비하며 테스트하는 과정을 간단하게 담아본다. create_async_engine from sqlalchemy.ext.asyncio import create_async_engine engine = create_async_engine.. 2022. 3. 18. ElasticSearch Ngram 활용하여 검색하는 방법 개요 많은 케이스가 있겠지만 보통 검색 용도로 ElasticSearch를 사용하는 것으로 알고 있다. MySQL의 경우 LIKE쿼리를 사용하여 검색을 할 수 있는데, %파이썬% 과 같이 앞뒤로 %를 사용하여 검색하는 경우 인덱스를 태우지 못하고 Full scan을 해버린다. 데이터베이스는 데이터베이스일 뿐 검색용도가 아니기에 애초에 적합하지 않다. 그렇다면 엘라스틱 서치를 사용하여 단순히 검색 쿼리를 날리면 바로 해결이 가능할까? 보통 DB를 접하다가 ES를 처음 접하는 사람들은 LIKE쿼리와 같이 Wildcard를 줘서 검색하는 방법을 찾곤 한다. (나또한 그랬다) 아무리 엘라스틱 서치가 검색 용도에 적합하다고는 하지만, 데이터베이스와 마찬가지로 와일드 카드를 통해 검색을 진행하면 속도 저하가 발생할 .. 2021. 8. 11. FastAPI SQLAlchemy Session 객체 연동하기 개요 동기적으로 돌아가는 서버의 경우 Thread-local을 적용하면 각 Request별로 다른 Context를 가지도록 할 수 있다. 하지만 asyncio를 통해 이벤트 루프를 사용하는 비동기 서버의 경우(FastAPI, Sanic...) Thread-local로는 이러한 문제를 해결할 수 없다. 따라서 Python 3.7 버전부터 제공되는 ContextVar를 사용해야하는데 이에 대해 간략하게 기술한다. 참고로 예제 서버는 FastAPI이다. 발생할 수 있는 문제 그렇다면 어떠한 문제가 발생할 수 있을까? 일반적으로 파이썬의 코루틴은 싱글 스레드로 동작하기때문에 하나의 스레드에서 여러가지의 일을 Concurrency하게 번갈아가며 수행한다. 그렇기에 SQLAlchemy의 세션 객체 또한 공유하면서 .. 2021. 2. 15. Pydantic SQLAlchemy relationship conditional load 1. 개요현재 서버 프레임워크로는 FastAPI를 사용하고있고 ORM은 SQLAlchemy를 사용하고 있다. FastAPI는 내부적으로 Pydantic이라는 라이브러리와 강결합되어있는 형태이며 해당 라이브러리를 디폴트로 Serialize등의 행위를 수행한다. 서버의 아키텍처는 Layered architecture를 사용하고 있었고, Repository에서의 반환값을 ORM모델이 아닌 Pydantic모델로 통일하자는 이야기가 있었다. (Entity와 비슷한 개념이라고 볼 수 있겠다) 일반적으로 ORM 모델을 정의할 때 ORM의 장점을 살리기위해 relationship을 정의하고 해당 property를 통해 관계된 테이블의 요소에 접근한다. 여기서 문제가 하나 발생했는데, SQLAlchemy 모델 -> Py.. 2020. 9. 22. SQLAlchemy Many To Many Additional Column 1. 요구 사항이벤트와 비디오는 M:N관계이다. 이벤트에 속한 비디오를 가져올 때 특정 컬럼을 통해 정렬하여 가져와야 한다. 2. 해결 방법아래와 같이 events, videos두개의 테이블이 존재한다고 가정한다.class Event(Base): __tablename__ = 'events' id = Column(BigInteger, primary_key=True, autoincrement=True) title = Column(Unicode(255))class Video(Base): __tablename__ = 'videos' id = Column(BigInteger, primary_key=True, autoincrement=True) name = Column(Unicode(255))만약 여러개의 비디오가.. 2020. 6. 26. SQLAlchemy PostgreSQL JSON컬럼 변경안되는 문제 해결 방법 1. 개요PostgreSQL은 JSON타입의 컬럼을 지원한다. NoSQL처럼 Schemaless 형태의 데이터를 저장할 필요성이 있지만, NoSQL로 가기는 조금 꺼려지는 경우에 사용하기 용이할것같다. SQLAlchemy에서 JSON타입의 컬럼을 다루다보면 이상하게도 값이 업데이트되지 않는 현상이 발생한다. 예를 들어서, class Order(Base): __tablename__ = 'orders' id = Column(Integer, primary_key=True, autoincrement=True) info = Column(JSONB)위와 같은 테이블이 있다고 가정하자. info같은 경우 JSON타입으로 되어있는데 만약 값을 바꾸고 싶다면 일반적으로 아래와 같은 코드를 사용할 것이다. order = .. 2020. 4. 25. 이전 1 2 3 4 5 ··· 19 다음