2010-05-18 11 views
5

Estoy construyendo una biblioteca de base de datos para mi aplicación usando sqlite3 como base. Quiero estructurarlo de este modo:¿Cómo debería crear un paquete de base de datos simple para mi aplicación Python?

 
db/ 
    __init__.py 
    users.py 
    blah.py 
    etc.py  

Así que haría esto en Python:

import db 
db.users.create('username', 'password') 

estoy sufriendo parálisis de análisis (oh no!) Acerca de cómo manejar la conexión de base de datos. Realmente no quiero usar clases en estos módulos, realmente no parece apropiado poder crear un conjunto de objetos de "usuarios" que puedan manipular la misma base de datos de la misma manera, por lo que heredar una conexión es un no-go.

¿Debo tener una conexión global a la base de datos que utilizan todos los módulos, y luego poner esto en cada módulo:

#users.py 
from db_stuff import connection 

O debería crear una nueva conexión para cada módulo y mantener esa vida?

¿O debería crear una nueva conexión para cada transacción?

¿Cómo se supone que se utilizan estas conexiones de base de datos? Lo mismo ocurre con los objetos del cursor: ¿creo un cursor nuevo para cada transacción? Crear solo uno para cada conexión de base de datos?

Respuesta

4

No, no extienda la conexión a varios módulos: este es un mal diseño. Haga que una sola clase maneje la conexión DB y proporcione servicios a otras clases/módulos en su aplicación.

Esto no es diferente de los buenos principios de diseño no relacionados con la base de datos. Una conexión es un recurso global. Compartir ese recurso en muchos módulos es similar a tener una variable global accesible desde muchos lugares, lo que es por defecto algo malo (a menos que tengas una razón muy convincente, pero no es así). Encapsule el recurso global en una clase para manejarlo.

+0

una expresión muy elegante de un precepto ignorado con demasiada frecuencia. – msw

+0

entonces, ¿tiene una conexión global pero la envuelve en una clase? Eso no parece muy diferente de tener una conexión global pero ponerla en un módulo ... ¿Es malo que cada módulo inicie sus propias conexiones? –

+0

no importa, después de leerlo descubrí que dos conexiones a la misma base de datos no funcionan tan bien:/ –

3

Sé que esto realmente no responde la pregunta real que hizo, pero la respuesta real es que probablemente no debería implementar su propio paquete de base de datos. Probablemente deberías usar uno existente (por ejemplo, SQLALchemy) y luego usar el patrón que sea estándar para esa biblioteca.

Si realmente quiere hacer su propio esfuerzo, el mejor enfoque dependerá de muchos factores, p. ¿El proyecto seguro solo necesitará una conexión a una base de datos?

Si se trata de una aplicación bastante simple, creo que la importación de un objeto de conexión global es probablemente el camino a seguir. Siempre puede cambiarlo por un grupo de conexiones detrás de las escenas, etc.

+0

es una aplicación bastante simple, todo lo que este paquete está haciendo es dar nombres a un montón de consultas, realmente. Simplemente no estaba seguro de * cuándo * crear conexiones de bases de datos. –

+0

+1 por sugerir SQLAlchemy, incluso para una aplicación simple puede ser una buena idea, hace que escribir consultas de bases de datos sea mucho más Pythonic :) También implementa internamente la agrupación de conexiones y el manejo de la sesión de ámbito por hilo para que no tenga que Preocúpate por estas cosas. Simplemente haga una sesión cuando la necesite y se encargará de los detalles sangrientos y optimizaciones. – wump

Cuestiones relacionadas