2014-09-02 2 views
1

저는 일종의 미니 ERP로 간주되는 중소기업 용 웹 응용 프로그램을 만들고 있습니다. webapp은 AngularJS로 구축되었으므로 서버 측을 주로 사용하여 데이터베이스를 관리하고 멋진 REST API를 제공합니다.SQLAlchemy ORM 쿼리 결과를 ORM 개체를 만드는 대신 JSON으로 변환

나는 ORM으로 작업하는 것을 정말 좋아하며, 내 요구에 꼭 맞습니다. 데이터베이스 계층에 SQLAlchemy를 사용하기 때문에 매우 쉽고 편리하게 사용할 수 있습니다 (그리고 Python을 좋아합니다). 그러나 SQLAlchemy의 ORM 계층을 사용할 때 일부 엔티티에 결과 (필요한 경우 하위 포함)를 쿼리하려는 경우 요구 된 쿼리를 실행하지만 결과를 얻을 때마다 파이썬이 생성됩니다 각각의 결과에 대한 객체 및 또한 (내 이해에 따라) 결과 객체를 유지 관리하는 많은 작업을 수행하므로 사용자가 함께 작업하고 데이터베이스와 동기화 상태를 유지할 수 있습니다. 그러나 결과를 랩핑하고 SQLAlchemy 엔티티를 생성하는 것은 (SQLAlchemy에서 unit-of-work라고 부름), 결과를 (튜플을 통해) 얻는 것과는 대조적으로 매우 느립니다 (수천 개의 결과는 몇 초 정도 걸립니다). 꽤 빠릅니다.

AngularJS를 사용하고 있기 때문에, 원하는 것은 먼저 Python 객체로 변환하고 불필요한 작업을 수행하는 대신 JSON으로 변환된다는 것입니다. 중첩 된 쿼리 및 관계를 관리하는 데 도움이되므로 ORM을 사용하는 것이 좋습니다. 그러나 선택의 여지가 없으면 아마 SQLAlchemy Core로 되돌아갑니다.하지만이 구문을 분석하는 것은 매우 어려울 것입니다. 결과는 JSON 개체로 (그리고 REST API에 대한 모든 쿼리를 관리합니다. 일부는 사용자가 작성한 사용자 정의 쿼리가 될 것입니다. 결국 관리 시스템입니다 ...). SQLAlchemy의 ORM은 이미 결과를 구문 분석하고 쿼리를 생성하기 때문에 순수한 Python 객체를 만드는 대신 JSON 객체 (실제로는 Python의 사전과 목록 일 수 있음)를 만들고 싶습니다.

아이디어 내가 원하는 것을 성취하는 방법?

TL; DR :

읽기 표제. 당신이 가장 recentish의 PostgreSQL을 사용할 수있을만큼 운이 좋은 경우

+0

그렇지 않습니다! 나는 파이썬 객체 내부에서 결과를 완전히 감싸는 것을 피하고 원시 사전 (JSON과 같은 형식)으로 직접 돌려주고 싶다. 당신이 참조하는 질문은 Python 객체를 jsonify하는 방법을 묻습니다 (질문에서 OP 케이스는 Model 기본 클래스의 인스턴스입니다). 앞에서 말했듯이, 파이썬 객체 내부에 결과를 래핑하고 SQLAlchemy가하는 모든 추가 작업을 수행하는 것은 매우 느리며 필요 없습니다. 추가 작업없이 사전 내에서 결과를 원합니다. – rboy

+0

수 없습니다. 당신이 얻을 수있는 가장 가까운 것은 orm 대신 코어 레이어를 사용하는 것입니다. 그래도 링크 된 질문에 설명 된 내용을 수행해야합니다. 죄송 합니다만, 여전히 복제본입니다. – davidism

답변

2

, 당신은 이미 서버 측에 recent JSON functions 같은 row_to_json() 등의 기능을 사용할 수 있습니다

형식의 문자열로 각 행을 반환
select row_to_json(mytable) from mytable 

'{ " 열 ":"값 ","열 2 ":"값 2 "} '. 그런 다음 SQLAlchemy Core를 사용하여 결과 행을 파이썬에서 건드리지 않고 바로 클라이언트 측으로 반복 할 수 있습니다.

+0

이것은 아주 좋은 기능입니다. 불행히도 선택의 여지가 내 데이터베이스를 MySQL을, 어떤 경험이있다. 이 기능이 조인을 처리하는 방법에 관심이 있습니까? 제 말은 Post 테이블과 Comments 테이블을 가지고 있고 모든 게시물을 얻고 싶을 때 예상되는 JSON이 중첩 된 모든 주석을 게시하고 싶을 때 PostgreSQL은이를 처리하는 방법을 알고 있습니까? 조인 된 모든 열을 키로 사용하여 편평한 JSON 객체를 반환합니다. – rboy

+0

그래, 평평한 물건.결론적으로 객체 그래프를 지원해야하는 경우 SA의 ORM에 대한 추가 비용을 지불하지 않아도됩니다. 주석에 사용자가있는 작성자가 있다면 SA는 각 사용자에게 ORM을 한 번만 수행 한 다음 PK로 매핑해야합니다. . –

+0

테스트하지 않고는 속도가 느리다는 말을하지 않았습니다. SQLAlchemy는 최근에 가져온 개체를 캐시 (세션)에 저장하고 필요할 경우 다른 쿼리를 보내지 않고 개체를 검색합니다. 어쨌든 세션에없는 객체의 경우 객체를 만들고 유지하는 프로세스가 매우 느립니다. 각 게시물에 50 개의 주석이 있고 각 주석에 25 개의 하위 주석 (25000 개 결과)이있는 20 개의 게시물을 검색 한 결과 결과를 가져 오는 동안 (쿼리 실행 및 소켓은 0.02 초 걸렸다. – rboy