Pregunta

Hay un paradigma de Java para el acceso de base de datos implementada en el DataSource Java. Este objeto crear una abstracción útil en torno a la creación de conexiones de bases de datos. El objeto DataSource mantiene la configuración de base de datos, pero sólo va a crear conexiones de base de datos a petición. Esto se le permite mantener toda la configuración de base de datos y el código de inicialización en un solo lugar, y hace que sea fácil cambiar la aplicación de base de datos, o utilizar una base de datos simulada para la prueba.

Actualmente trabaja en un proyecto de Python que utiliza cx_Oracle. En cx_Oracle, se obtiene una conexión directa desde el módulo:

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?

Estoy tratando de encontrar un paralelo a la DataSource en cx_Oracle. Puedo crear fácilmente mediante la creación de una nueva clase y envolver cx_Oracle, pero me preguntaba si esta es la forma correcta de hacerlo en Python.

¿Fue útil?

Solución

Encontrará información relevante de cómo acceder a bases de datos en Python examinado PEP-249: Python API Base de Datos de la especificación v2.0 . cx_Oracle ajusta a esta especificación, al igual que muchos controladores de base para Python.

En la presente memoria un objeto Connection representa una conexión de base de datos, pero no hay ninguna agrupación integrada. Herramientas tales como SQLAlchemy no dar facilidades de fondo común, y aunque SQLAlchemy es a menudo considerado como un ORM, que no tiene para ser utilizados como tales y ofrece buenas abstracciones para su uso en la parte superior de los motores de SQL.

Si quieres hacer objeto-relacional-mapeo, entonces SQLAlchemy que hace la empresa, y se puede considerar o bien su propia sintaxis declarativa o de otra capa como Elixir que se encuentra en la parte superior de SQLAlchemy y proporciona una mayor facilidad de uso para los casos de uso más comunes.

Otros consejos

No creo que hay una manera "correcta" de hacer esto en Python, excepto tal vez para ir un paso más allá y utilizar otra capa entre usted y la base de datos.

Dependiendo de la razón para querer utilizar el concepto de origen de datos (que sólo he encontrado en Java), SQLAlchemy (o algo similar) podría resolver los problemas para usted, sin tener que escribir algo desde cero.

Si eso no encajaba, la escritura de su propio envoltorio suena como una solución razonable.

Sí, Python tiene una abstracción similar.

Esto es de nuestra prueba de regresión acumulación local, donde nos aseguramos que podemos hablar con todas nuestras bases de datos cada vez que construimos un nuevo pitón.

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, esta es la versión sencilla, en nuestro código multidb-conscientes que tenemos una clase DbConnection que tiene esta lógica en el interior.)

Yo sólo lo chupó y escribir mi propia. Me permitió agregar cosas como la abstracción de la base de datos (Oracle / MySQL / Acceso / etc), la adición de la explotación forestal, el manejo de errores con reversiones de transacción, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top