2009-07-18 8 views
3

Il existe un paradigme Java pour l'accès à la base de données implémenté dans Java DataSource. Cet objet crée une abstraction utile autour de la création des connexions à la base de données. L'objet DataSource conserve la configuration de la base de données, mais ne crée des connexions de base de données que sur demande. Cela vous permet de conserver en un seul endroit tout le code de configuration et d'initialisation de la base de données et facilite la modification de l'implémentation de la base de données ou l'utilisation d'une base de données fictive à des fins de test.cx_Oracle et le paradigme de la source de données

Je travaille actuellement sur un projet Python qui utilise cx_Oracle. Dans cx_Oracle, on obtient une connexion directement à partir du module:

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? 

Je suis en train de trouver un parallèle au DataSource dans cx_Oracle. Je peux facilement créer ceci en créant une nouvelle classe et en enveloppant cx_Oracle, mais je me demandais si c'était la bonne façon de le faire en Python.

Répondre

3

Vous trouverez des informations pertinentes sur l'accès aux bases de données en Python en consultant PEP-249: Python Database API Specification v2.0. cx_Oracle est conforme à cette spécification, tout comme de nombreux pilotes de base de données pour Python.

Dans cette spécification, un objet Connection représente une connexion à une base de données, mais il n'y a pas de regroupement intégré. Des outils tels que SQLAlchemy fournissent des fonctionnalités de pool, et même si SQLAlchemy est souvent facturé comme un ORM, il n'est pas nécessaire de l'utiliser en tant que tel et offre de belles abstractions à utiliser sur les moteurs SQL. Si vous voulez faire un mappage relationnel-objet, alors SQLAlchemy fait l'affaire, et vous pouvez considérer sa propre syntaxe déclarative ou une autre couche telle que Elixir qui se trouve au-dessus de SQLAlchemy et offre une facilité d'utilisation accrue pour cas d'utilisation plus communs.

1

Je ne pense pas qu'il existe une "bonne" façon de faire cela en Python, sauf peut-être aller plus loin et utiliser un autre calque entre vous et la base de données. En fonction de la raison de vouloir utiliser le concept DataSource (que j'ai rencontré seulement en Java), SQLAlchemy (ou quelque chose de similaire) pourrait résoudre les problèmes pour vous, sans que vous ayez à écrire quelque chose à partir de zéro.

Si cela ne correspond pas à la facture, l'écriture de votre propre enveloppe semble être une solution raisonnable.

0

Oui, Python a une abstraction similaire. Ceci est issu de notre test de régression de construction locale, où nous nous assurons que nous pouvons parler à toutes nos bases de données chaque fois que nous construisons un nouveau python.

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/[email protected]") 

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

(note, ceci est la version simple, dans notre code Multidb conscients que nous avons une classe DbConnection qui a cette logique à l'intérieur.)

0

Je viens sucé et écrit mon propre. Cela m'a permis d'ajouter des choses comme l'abstraction de la base de données (Oracle/MySQL/Access/etc), l'ajout de la journalisation, la gestion des erreurs avec des rollbacks de transaction, etc.

Questions connexes