Domanda

C'è un paradigma Java per l'accesso al database implementato nel DataSource Java. Questo oggetto creare un'astrazione utile attorno alla creazione di connessioni al database. L'oggetto DataSource mantiene la configurazione del database, ma solo creare connessioni di database su richiesta. Questo è consente di mantenere tutte le configurazioni del database e il codice di inizializzazione in un unico luogo, e lo rende facile cambiare implementazione del database, oppure utilizzare un database finto per il test.

Io attualmente lavorando su un progetto che utilizza Python cx_Oracle. In cx_Oracle, si ha una connessione direttamente dal modulo:

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?

Sto cercando di trovare un parallelo al DataSource in cx_Oracle. Posso facilmente creare questa con la creazione di una nuova classe e confezionamento cx_Oracle, ma mi chiedevo se questo è il modo giusto per farlo in Python.

È stato utile?

Soluzione

Troverete le informazioni utili su come accedere ai database in Python, cercando in PEP-249: Python Database API Specification v2.0 . cx_Oracle conforme a questa specifica, come fanno molti driver di database per Python.

In questa specifica un oggetto Connection rappresenta una connessione al database, ma non c'è il pool di built-in. Strumenti come SQLAlchemy non fornire servizi di pooling, e anche se SQLAlchemy è spesso annunciata come un ORM, non ha per essere usato come tale e offre belle astrazioni per l'uso in cima motori SQL.

Se si vuole fare object-relational mapping, quindi SQLAlchemy fa il business, e si può prendere in considerazione sia la propria sintassi dichiarativa o un altro strato come Elixir che si trova sulla parte superiore del SQLAlchemy e offre una maggiore facilità d'uso per casi di utilizzo più comuni.

Altri suggerimenti

Non credo che ci sia un modo "giusto" per fare questo in Python, tranne forse per fare un passo avanti e utilizzare un altro strato tra te e il database.

A seconda del motivo per voler utilizzare il concetto DataSource (che ho sempre e solo incontrato in Java), SQLAlchemy (o qualcosa di simile) potrebbe risolvere i problemi per voi, senza dover scrivere qualcosa da zero.

Se che non si adatta il disegno di legge, scrivendo il proprio involucro suona come una soluzione ragionevole.

Sì, Python ha un'astrazione simile.

Questa è la nostra prova dal accumulo di regressione locale, dove ci assicuriamo che siamo in grado di parlare a tutti i nostri database ogni volta che costruiamo un nuovo pitone.

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

(nota, questa è la versione semplice, nel nostro codice MultiDB-aware abbiamo una classe DbConnection che ha questa logica interna.)

Ho appena succhiato in su e scritto il mio. Mi ha permesso di aggiungere le cose come astrazione del database (Oracle / MySQL / Accesso / etc), aggiungendo la registrazione, la gestione degli errori con rollback di transazione, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top