Frage

Es ist ein Java-Paradigma Zugang für Datenbank in der Java DataSource implementiert. Diese Aufgabe eine nützliche Abstraktion um die Erstellung von Datenbankverbindungen erstellen. Das DataSource Objekt hält die Datenbankkonfiguration, sondern nur Datenbankverbindungen auf Anfrage erstellen. Dies ermöglicht es Ihnen, in einem Ort alle Datenbankkonfiguration und Initialisierungscode zu halten, und macht es einfach, Datenbank-Implementierung zu ändern, oder eine Mock-Datenbank zum Testen verwenden.

Ich arbeite derzeit an einem Projekt, das Python cx_Oracle verwendet. In cx_Oracle, so erhält man eine Verbindung direkt aus dem Modul:

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?

Ich versuche, eine parallel zur DataSource in cx_Oracle zu finden. Ich kann dies leicht erstellen, indem Sie eine neue Klasse erstellen und Verpackung cx_Oracle, aber ich frage mich, ob dies der richtige Weg ist es in Python zu tun.

War es hilfreich?

Lösung

finden Sie relevante Informationen finden, wie mithilfe der Datenbanken in Python zugreifen unter PEP-249: Python Database API Specification v2.0 . cx_Oracle entspricht diese Beschreibung, wie viele Datenbanktreiber für Python tun.

In dieser Beschreibung ein Connection Objekt eine Datenbankverbindung darstellt, aber es gibt kein eingebautes in Pooling. Tools wie SQLAlchemy liefern Pooling Einrichtungen, und obwohl SQLAlchemy oft als ORM in Rechnung gestellt wird, ist es nicht haben schöner Abstraktionen für den Einsatz auf den SQL-Motoren werden als solche verwendet und bietet.

Wenn Sie nicht möchten, objektrelationale Mapping tun, dann SQLAlchemy tut das Geschäft, und Sie können entweder eine eigene deklarative Syntax oder eine andere Schicht wie Elixir die oben auf SQLAlchemy sitzt und einfache Bedienung bietet für häufige Anwendungsfälle erhöht.

Andere Tipps

Das glaube ich nicht, dass es ein „richtiger“ Weg, dies in Python zu tun, außer vielleicht noch einen Schritt weiter zu gehen und eine andere Schicht zwischen dir selbst und der Datenbank verwendet werden.

Je nach dem Grund für den Wunsch, die Datasource-Konzept zu verwenden (was ich je nur in Java kommen across), SQLAlchemy (oder so ähnlich) könnten die Probleme für Sie lösen, ohne dass Sie etwas von Grund auf neu zu schreiben.

Wenn das nicht die Rechnung paßt, klingt Ihre eigenen Wrapper zu schreiben wie eine vernünftige Lösung.

Ja, Python hat eine ähnliche Abstraktion.

Dies ist aus unserem lokalen Build Regressionstest, in dem wir versichern, dass wir für alle unsere Datenbanken sprechen können, wenn wir eine neue Python bauen.

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

(beachten Sie, das ist die einfache Version, in unserem Multidb-aware-Code haben wir eine DbConnection Klasse, die diese Logik nach innen hat.)

Ich saugte es einfach auf und schrieb meine eigenen. Es erlaubte mir, Dinge hinzuzufügen, wie die Datenbank zu abstrahieren (Oracle / MySQL / Zugang / etc), das Hinzufügen Protokollierung, Fehler mit der Transaktion Rollbacks Handling etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top