2010-09-23 8 views
9

Hemos trabajado duro para desarrollar un modelo de base de datos de nuestro problema, y ​​ahora es el momento de comenzar a codificar. Nuestros proyectos anteriores han utilizado consultas hechas a mano construidas por manipulación de cadenas.Python: interactuar con el almacén de datos complejo

¿Existe alguna práctica mejor/estándar para la interfaz entre python y un diseño de base de datos complejo?

me he evaluado brevemente SQLAlchemy, SQLObject, y Django-ORM, pero (yo pueda fácilmente estar perdiendo algo) que parecen estar sintonizados para la pequeña de tipo web (OLTP) las transacciones, donde estoy haciendo alto volumen analítica (OLAP) transacciones.

Algunos de mis necesidades, que pueden ser algo diferente de lo habitual:

  1. de carga de grandes cantidades de datos relativamente rápidamente
  2. actualizar/insertar pequeñas cantidades de datos de forma rápida y fácil
  3. manejar un gran número de filas fácilmente (300 entradas por minuto durante 5 años)
  4. permiten modificaciones en el esquema, para requisitos futuros

Escribir estas consultas es fácil, pero escribir el código para alinear todos los datos es tedioso, especialmente a medida que el esquema evoluciona. Esto parece algo en lo que una computadora puede ser buena?

+1

Agregaré esto como un comentario, pero normalmente los ORM se usan para OLTP, y tratar de calzarlos para mapear un almacén de datos suele ser más problemático de lo que vale. – nos

+0

Aunque los ORM se pueden usar para OLTP, también pueden simplificar ciertos tipos de procesamiento de depósito de datos. La mayoría de las consultas de DW ** deberían ** ser simples 'seleccionar operaciones de suma/conteo y de agrupamiento por'. Tener estos generados por una herramienta ORM puede ser un gran ahorro de tiempo. –

+0

¿Los usuarios finales van a generar consultas? ¿Qué interfaz está proporcionando y qué niveles de libertad? – shmichael

Respuesta

2

SQLAlchemy definitivamente. En comparación con SQLAlchemy, todos los demás ORM se parecen al juguete de un niño. Especialmente el Django-ORM. Qué es Hibernate to Java, SQLAlchemy es para Python.

+0

He intentado aprender el SA ORM tres veces ahora y cada vez que me encuentro con errores completamente extraños que hacen que no quiera tocarlo nunca más. ¿Cómo lo aprendiste? – bukzor

+0

documentación y codificación. – dekomote

+0

"errores completamente extraños" o "suposiciones mías que resultaron ser falsas SA"? A menudo, hacemos suposiciones, encontramos que el software no coincide con nuestras suposiciones, y llamamos a todo esto "extraño". Sin detalles, es imposible evaluar tu afirmación. Si tiene problemas, publíquelos como preguntas. –

6

No se deje confundir por sus requisitos. Una talla no sirve para todos.

de carga de grandes cantidades de datos relativamente rápidamente

Por qué no usar los cargadores nativos de las bases de datos para esto? Use Python para preparar archivos, pero use herramientas de base de datos para cargar. Descubrirás que esto es increíblemente rápido.

actualización/insertar pequeñas cantidades de datos de forma rápida y sencilla

que empieza a romper las reglas de un almacén de datos. A menos que esté hablando de Master Data Management para actualizar los atributos de informe de una dimensión.

Para eso están diseñados ORM y frameworks web.

manejar un gran número de filas facilidad (300 entradas por minuto más de 5 años)

Una vez más, es por eso que utilice una tubería de procesamiento de front-end Python, pero del INSERT real son realizadas por la base de datos herramientas. No Python.

esquema alter (junto con la interfaz de Python) fácilmente, para los futuros requisitos

usted no tiene casi ningún uso para automatizar esto. Sin duda es su tarea de menor prioridad para "programar".A menudo lo hará manualmente para preservar los datos correctamente.

Por cierto, "consultas hechas a mano construidas por manipulación de cadenas" es probablemente el mayor error de todos. Estos son difíciles de manejar para el analizador RDBMS; son más lentos que el uso de consultas que tienen variables de vinculación insertadas.

+0

Gracias. Lo que quise decir con "alterar" fue "no bloquear el esquema". Muchas veces, cuando se interactúa con una base de datos, se llega a un cierto umbral de líneas de código que se modificarán donde ya no valga la pena editar el esquema. Me gustaría evitar esa situación por completo si es posible. – bukzor

+0

Al cargar en la base de datos, ¿cómo maneja los datos nuevos que se superponen a los antiguos? ¿O simplemente carga todos los datos cada vez? Eso parece prohibitivamente ineficiente. – bukzor

+0

@bukzor: Data Warehouse (casi siempre) significa insert-only. Los datos nuevos, por definición, son * nuevos * y no * se superponen * a los antiguos. Puede compartir algunas claves comunes, pero es * nuevo *. Encuentre una copia de The Data Warehouse Toolkit de Kimball antes de continuar. –

3

Estoy usando SQLAlchemy con un datawarehouse bastante grande y lo estoy usando para el proceso completo de ETL con éxito. Especialmente en ciertas fuentes donde tengo algunas reglas de transformación complejas o con algunas fuentes heterogéneas (como servicios web). No estoy usando el Sqlalchemy ORM, sino más bien utilizando su Lenguaje de Expresión SQL porque realmente no necesito mapear nada con objetos en el proceso ETL. Vale la pena notar que cuando traigo una copia textual de algunas de las fuentes, prefiero usar las herramientas db para eso, como la utilidad de volcado de PostgreSQL. No puedes vencer eso. SQL Expression Language es lo más cercano que obtendrá con SQLAlchemy (o cualquier ORM) para escribir a mano SQL, pero dado que puede generar programáticamente el SQL de python ahorrará tiempo, especialmente si tiene reglas de transformación muy complejas.

Una cosa, prefiero modificar mi esquema a mano. No confío en ninguna herramienta para ese trabajo.

+0

+1: "modificar mi esquema a mano".Es muy difícil escribir una herramienta para esto: demasiados casos especiales. –

+0

¿Tiene las fuentes y los objetivos en el mismo servidor? – hugo24

+0

Déjame ver ...: una fuente está en el mismo servidor y otras tres están en tres servidores diferentes (dos postgresql, 1 mysql y 1 oráculo son mis fuentes). Además, estoy recopilando datos de un SOAP WS de SalesForce y datos de algunas aplicaciones de Google (Analytics y Calendar). – Mariano

Cuestiones relacionadas