2011-09-15 4 views
1

다른 응용 프로그램의 데이터베이스와 인터페이스해야하는 응용 프로그램이 있습니다. 나는 읽기 권한을 가지고 있지만 쓰지는 않습니다.python을 사용하여 효과적으로 다른 데이터베이스와 인터페이스하는 방법

현재 pyodbc를 통해 SQL 문을 사용하여 행을 가져 와서 python을 사용하여 데이터를 조작합니다. 나는 아무것도 캐시하지 않기 때문에 이것은 꽤 비쌀 수 있습니다.

내 문제를 해결하기 위해 ORM을 사용하려고합니다. 질문은 "SQL alchemy"와 같은 ORM을 사용하면 다른 데이터베이스에서 변경 사항을 적용 할만큼 똑똑할까요?

예. sql alchemy는 테이블에 액세스하고 행을 검색합니다. 그 행이 SQL alchemy 외부에서 수정 된 것이라면 그것을 집어들만큼 똑똑할까요?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

편집 : 내가 하나가

더 명확하게하려면 인 응용 프로그램은 단순히보고 도구는 내가 앱 B.라는 다양한 금융 거래를 처리하는 다른 응용 프로그램이

애플리케이션 A를 호출 할 수 있습니다

A는 트랜잭션을 검색하기 위해 B의 데이터베이스에 액세스 할 수있는 다양한 보고서를 생성합니다. 수십만 건의 거래가 있습니다. 우리는 현재 파이썬에서이 정보를 수동으로 캐싱하고 있습니다. 업데이트 된 보고서가 필요하면 캐시를 새로 고칩니다. 캐시를 없애면 계산과 결합 된 SQL 쿼리는 조정할 수 없게됩니다.

+0

정확히 무슨 문제입니까? 무엇을 성취하려고합니까? 데이터베이스간에 동기화 된 데이터를 유지 하시겠습니까? – hymloth

+0

'last_modified'열을 가진 객체가 없습니까? 당신은 이것을 활용할 수 있습니다 ... – plaes

답변

2

ORM이 성능 문제에 대한 해결책이라고 생각하지 않습니다. 기본적으로 ORM은 SQLAlchemy가 생성 된 SQL에 대한 세분화 된 제어를 허용하지만 사용자가 사용하지 않을 데이터 (예 : 한 필드 만 필요할 때 SELECT *을 수행)를 가져올 수 있기 때문에 행 SQL보다 비효율적 인 경향이 있습니다.

캐싱 메커니즘을 구현하려면 응용 프로그램에 따라 메모리에있는 간단한 사전이나 memcached 또는 Redis와 같은 특수 시스템을 사용할 수 있습니다.

캐시 된 데이터를 비교적 최신 상태로 유지하려면 일정한 간격으로 소스를 폴링 할 수 있습니다. 응용 프로그램이 약간의 지연을 허용 할 수 있으면 문제가되지 않을 수도 있습니다. 그렇지 않으면 업데이트가 발생할 때 응용 프로그램이나 캐시 시스템에 알리기 위해 db에 대한 쓰기 권한이있는 응용 프로그램이 필요합니다.

편집 : 앱 B를 제어 할 수 있으므로 앱 A에 캐시 시스템이 있으므로 가장 간단한 방법은 문제를 해결할 수있는 앱 B에서 호출 할 수있는 콜백을 만드는 것입니다. 캐시 된 항목이 만료됩니다. 두 앱 모두 캐시 된 항목을 식별하기 위해 협약에 동의해야합니다.

+0

답장을 보내 주셔서 감사합니다. 회신을 편집하여 희망 사항을 약간 더 명확히했습니다. –

+2

데이터베이스 변경에 대해 통보받는 마법 같은 방법은 없습니다. SQLAlchemy 또는 다른 방법을 통해 액세스하는 모든 레코드를 다시 페치하는 것은 아마도 너무 낭비 일 것입니다. 특정 데이터베이스는 SP 및 트리거가 파일 또는 소켓과 같은 것을 액세스 할 수있게합니다 (Oracle은 DBMS_PIPE, Postgres는 DMBS_PIPE 및 Listen/Notify, MySQL에 대해서는 알지 못합니다). 알림을 보내는 B의 데이터베이스에 트리거를 추가하면이 문제를 해결할 수 있습니다. – 9000

관련 문제