Question

Il y a un paradigme Java pour l'accès base de données mis en œuvre dans le Java DataSource. Cet objet crée une abstraction utile autour de la création de connexions de base de données. L'objet DataSource conserve la configuration de base de données, mais ne créer des connexions de base de données sur demande. Cela vous permet de conserver toutes les configurations de base de données et le code d'initialisation en un seul endroit, et il est facile de changer la mise en œuvre de base de données ou utiliser une base de données pour le test simulé.

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 en créant une nouvelle classe et emballage cx_Oracle, mais je me demandais si cela est la bonne façon de le faire en Python.

Était-ce utile?

La solution

Vous trouverez des informations pertinentes de la façon d'accéder à des bases de données en Python en regardant PEP-249: Python API de base de données Spécification v2.0 . cx_Oracle conforme à cette spécification, comme de nombreux pilotes de base de données pour Python.

Dans cette spécification un objet Connection représente une connexion de base de données, mais il n'y a pas mise en commun intégré. Des outils tels que SQLAlchemy ne fournissent des installations de mise en commun, et bien que SQLAlchemy est souvent présenté comme un ORM, il n'a pas à utiliser en tant que telle et offre de belles abstractions pour une utilisation sur des moteurs SQL.

Si vous voulez faire-consanguine mapping objet, puis SQLAlchemy fait l'entreprise, et vous pouvez considérer soit sa propre syntaxe déclarative ou d'une autre couche telle que Elixir qui se trouve au-dessus de SQLAlchemy et fournit une plus grande facilité d'utilisation pour les cas d'utilisation les plus courantes.

Autres conseils

Je ne pense pas qu'il y ait une « bonne » façon de le faire en Python, sauf peut-être aller un peu plus loin et utiliser une autre couche entre vous-même et la base de données.

Selon la raison de vouloir utiliser le concept de DataSource (que je ne l'ai jamais rencontré 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 au projet de loi, écrire votre propre emballage ressemble à une solution raisonnable.

Oui, Python a une abstraction similaire.

est de notre test de régression de construction locale, où 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/secret@oracletestdb")

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-aware nous avons une classe DbConnection qui a cette logique à l'intérieur.)

Je viens sucé et écrit mon propre. Cela m'a permis d'ajouter des choses comme abstraire la base de données (Oracle / MySQL / Access / etc), en ajoutant l'enregistrement, la gestion des erreurs avec les annulations de transactions, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top