Base de datos de Python / progtwigción de sql – dónde comenzar

¿Cuál es la mejor manera de usar una base de datos integrada, por ejemplo, sqlite en Python:

  1. Debe ser pequeña huella. Solo necesito unos cuantos miles de registros por mesa. Y solo un puñado de tablas por base de datos.
  2. Si es una proporcionada por la instalación predeterminada de Python, entonces genial. Debe ser de código abierto, disponible en Windows y Linus.
  3. Es mejor si SQL no se escribe directamente, pero no se necesita totalmente ORM. Algo que me protegerá de la base de datos real, pero no de una biblioteca tan grande. Algo similar a ADO será genial.
  4. La mayoría se utilizará a través del código, pero si hay una interfaz gráfica de usuario, entonces es genial
  5. Necesita solo unas pocas páginas para comenzar. No quiero pasar por las páginas que leen qué es una tabla y cómo funciona una statement Select. Sé todo eso.
  6. Se prefiere el soporte para Python 3, pero 2.x también está bien.

El uso no es una aplicación web. Es una pequeña base de datos para albergar a lo sumo 5 tablas. Los datos en cada tabla son solo unas pocas columnas de cadena. Piensa algo más grande que un diccionario en escabeche.

Actualización : Muchas gracias por las grandes sugerencias.
El caso de uso del que estoy hablando es bastante simple. Uno que probablemente harías en uno o dos días.
Es un script de Python de 100 líneas que recostack datos sobre un número relativamente grande de archivos (por ejemplo, 10k) y crea archivos de metadatos sobre ellos, y luego un archivo de metadatos de gran tamaño sobre todo el árbol de archivos. Solo necesito evitar volver a procesar los archivos ya procesados, crear los metadatos para los archivos actualizados y actualizar el archivo principal de metadatos. En cierto modo, almacene en caché los datos procesados ​​y solo actualícelos en las actualizaciones de archivos. Si la memoria caché está dañada / no disponible, simplemente procese todo el árbol. Puede tomar 20 minutos, pero está bien.

Tenga en cuenta que todo el procesamiento se realiza en memoria.

Me gustaría evitar las dependencias externas, para que la secuencia de comandos se pueda poner fácilmente en cualquier sistema con solo una instalación de Python. Al ser Windows, a veces es difícil instalar todos los componentes. Por lo tanto, en mi opinión, incluso una base de datos podría ser una exageración.

Probablemente no activaría un Office Word / Writer para escribir una pequeña nota de tipo post-it, de manera similar, me resisto a usar algo como Django para este caso de uso.

¿Donde empezar?

Recomiendo encarecidamente el uso de un buen ORM. Cuando puedes trabajar con objetos de Python para administrar las filas de tu base de datos, la vida es mucho más fácil.

Soy fan del ORM en Django. Pero eso ya fue recomendado y dijiste que es demasiado pesado.

Esto me deja con exactamente un ORM para recomendar: otoño . Muy ligero, funciona muy bien con SQLite. Si su aplicación incrustada será multiproceso, entonces absolutamente desea otoño; Tiene extensiones para soportar SQLite multiproceso. (Revelación completa: escribí esas extensiones y las contribuí. Las escribí mientras trabajaba para RealNetworks, y mis jefes me permitieron donarlas, por lo tanto, un agradecimiento público a RealNetworks).

El otoño está escrito en puro Python. Para SQLite, usa el módulo SQLite oficial de Python para hacer las cosas reales de SQL. La huella de memoria del otoño en sí es pequeña.

No recomiendo APSW. En mi humilde opinión, realmente no hace mucho para ayudarte; simplemente proporciona una forma de ejecutar sentencias de SQL y le permite dominar la forma de hacer las cosas de SQL. Además, es compatible con todas las funciones de SQLite, incluso las que rara vez se utilizan, y como resultado, en realidad tiene una huella de memoria mayor que la de Autumn, aunque no es tan fácil de usar.

Comencé aquí:

http://www.devshed.com/c/a/Python/Using-SQLite-in-Python

Son 5 páginas (cortas) con lo esencial que me ayudaron a comenzar de inmediato.

Lo que estás buscando es SQLAlchemy , que se está convirtiendo rápidamente en la capa de acceso a datos de Python estándar de facto. Para hacer que sus primeras experiencias con SQLAlchemy sean aún más fáciles, consulte Elixir , que es un fino envoltorio de estilo ActiveRecord alrededor de SQLAlchemy.

Actualización : vuelva a leer la pregunta y vio lo poco sobre no necesitar un ORM completo. Todavía sugeriría ir a la ruta SQLAlchemy, solo porque le brinda una manera ridículamente fácil de trabajar con bases de datos en Python que puede reutilizar para cualquier tipo de base de datos. El tiempo dedicado a trabajar directamente con SQLite se desperdicia una vez que necesita conectarse a Oracle o algo así.

comenzar con Django

http://www.djangoproject.com/

ORM es el camino a seguir aquí. No te arrepentirás. El tutorial aquí http://docs.djangoproject.com/en/dev/intro/tutorial01/ es bastante suave.

¿Por qué Django / ORM? Django lo pondrá en funcionamiento en aproximadamente media hora, administrará las conexiones de su base de datos, las interfaces de administración de datos, etc. Django funciona con SQLLite: no necesitará administrar una instancia de MySQL / PostGre.

EDIT1: No necesita usar la parte de la aplicación web de Django para esto. Puede usar las clases db.Model para manipular sus datos directamente. Cualquiera que sea la aplicación / script independiente que se te ocurra, puedes usar la capa del modelo de datos de Django. Y cuando decida que desea un front-end web, o por lo menos le gustaría editar sus datos a través de la consola de administración, puede volver a publicar aquí y agradecerme (o todos los que dijeron usar un ORM) 🙂

Este es un conjunto de respuestas, sin ningún orden en particular:

Todo el mundo está recomendando una capa ORM. Lo que tiene mucho sentido, si realmente necesitas una base de datos. Bueno, eso fue una especie de pedido en el título 🙂

  1. SQLAlchemy
  2. Otoño
  3. Django ORM
  4. Utiliza el soporte oficial de SQLite Pysqlite.
  5. Tormenta
  6. Elixir
  7. Solo usa el propio Pickle de Python

Pero estoy empezando a pensar que si una base de datos en memoria es suficiente, esto se usará solo en scripts, no en una aplicación web o incluso en una interfaz gráfica de escritorio, entonces la opción 7 también es perfectamente válida, siempre que no se necesite soporte para transacciones y la integridad de la “base de datos” no es un problema.

Django es perfecto para esto, pero el póster no está claro si necesita hacer un EXE comstackdo o una aplicación web. Django es solo para aplicaciones web.

No estoy seguro de dónde realmente te pones “pesado”. Django es mucho más pequeño en términos de líneas de código que cualquier otro marco de aplicaciones web importante.

Otra opción para agregar a las otras buenas sugerencias: Elixir . Proporciona una capa declarativa simplificada sobre SQLAlchemy , por lo que debería ser más fácil sumergirse, pero también le permite recurrir a todo el poder de SQLAlchemy cuando lo necesite.

Hay un módulo Python fácil de usar que cumple con todos los objectives establecidos:

http://yserial.sourceforge.net/

Serialización + persistencia: en unas pocas líneas de código, comprima y anote los objetos de Python en SQLite; luego más tarde recuperarlos cronológicamente por palabras clave sin ningún SQL. El módulo “estándar” más útil para una base de datos para almacenar datos sin esquema.

Sorprendentemente, no hay mucha diferencia entre las soluciones en memoria y las soluciones persistentes para la mayoría de los propósitos prácticos.

En cuanto a “protegerme de la base de datos real”, con y_serial, uno ni siquiera puede decir que SQLite está detrás de todo. Si construye sus registros como diccionarios de Python, puede concentrarse solo en escribir código (no en procedimientos almacenados).

Si no desea utilizar un ORM, puede probar python-sql para crear sus consultas SQL.