문제

Java에서 구현 된 데이터베이스 액세스를위한 Java 패러다임이 있습니다. DataSource. 이 객체는 데이터베이스 연결 생성과 관련하여 유용한 추상화를 만듭니다. 그만큼 DataSource 개체는 데이터베이스 구성을 유지하지만 요청시 데이터베이스 연결 만 생성합니다. 이를 통해 모든 데이터베이스 구성 및 초기화 코드를 한 위치에 유지하고 데이터베이스 구현을 쉽게 변경하거나 테스트를 위해 Mock 데이터베이스를 사용할 수 있습니다.

저는 현재 CX_ORACLE를 사용하는 Python 프로젝트를 진행하고 있습니다. CX_ORACLE에서는 모듈에서 직접 연결됩니다.

import cx_Oracle as dbapi
connection = dbapi.connect(connection_string)
# At this point I am assuming that a real connection has been made to the database.
# Is this true?

나는 그것과 평행을 찾으려고 노력하고있다 DataSource CX_ORACLE에서. 새로운 클래스를 만들고 cx_oracle을 감싸서 쉽게 만들 수 있지만 이것이 파이썬에서 올바른 방법인지 궁금했습니다.

도움이 되었습니까?

해결책

Python에서 데이터베이스에 액세스하는 방법에 대한 관련 정보를 찾아 볼 수 있습니다. PEP-249 : Python Database API 사양 v2.0. cx_Oracle Python 용 많은 데이터베이스 드라이버와 마찬가지로이 사양을 준수합니다.

이 사양에서 a Connection 객체는 데이터베이스 연결을 나타내지 만 내장 풀링은 없습니다. 다음과 같은 도구 sqlalchemy 풀링 시설을 제공하고 SQLALCHEMY는 종종 ORM으로 청구되지만 SQL 엔진 상단에서 사용할 수있는 훌륭한 추상화를 제공 할 필요는 없습니다.

객체 관계 매핑을하고 싶다면 Sqlalchemy는 사업을 수행하며 자체 선언문 또는 다음과 같은 다른 계층을 고려할 수 있습니다. 엘릭서 Sqlalchemy 위에 위치하고 있으며보다 일반적인 사용 사례에 대한 사용 편의성을 제공합니다.

다른 팁

파이썬 에서이 작업을 수행 할 수있는 "올바른"방법이 없다고 생각합니다. 한 걸음 더 나아가 자신과 데이터베이스 사이에 다른 계층을 사용하는 것을 제외하고.

DataSource 개념 (Java에서만 만난 적이 있음)을 사용하려는 이유에 따라 Sqlalchemy (또는 유사한 것)는 처음부터 무언가를 쓰지 않아도 문제를 해결할 수 있습니다.

그것이 청구서에 맞지 않으면, 자신의 포장지를 쓰는 것은 합리적인 솔루션처럼 들립니다.

예, 파이썬은 비슷한 추상화를 가지고 있습니다.

이것은 로컬 빌드 회귀 테스트에서 나오는데, 여기서 새로운 파이썬을 만들 때마다 모든 데이터베이스와 대화 할 수 있습니다.

if database == SYBASE:
    import Sybase
    conn = Sybase.connect('sybasetestdb','mh','secret')
elif database == POSTRESQL:
    import pgdb
    conn = pgdb.connect('pgtestdb:mh:secret')
elif database == ORACLE:
    import cx_Oracle
    conn = cx_Oracle.connect("mh/secret@oracletestdb")

curs=conn.cursor()
curs.execute('select a,b from testtable')
for row in curs.fetchall():
    print row

(이것은 간단한 버전입니다. MultIDB 인식 코드에는이 논리가있는 DBConnection 클래스가 있습니다.)

나는 단지 그것을 빨고 내 자신을 썼다. 데이터베이스 추상 (Oracle/MySQL/Access/etc), 로깅 추가, 트랜잭션 롤백으로 오류 처리 등을 추가 할 수있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top