2008-10-17 12 views
14

He creado un módulo de Python que crea y rellena varias tablas de SQLite. Ahora, quiero usarlo en un programa, pero realmente no sé cómo llamarlo correctamente. Todos los tutoriales que he encontrado están esencialmente "en línea", es decir, se desplazan usando SQLite de forma lineal en lugar de cómo usarlo en la producción.Uso de SQLite en un programa de Python

Lo que estoy tratando de hacer es hacer una comprobación de método para ver si la base de datos ya está creada. Si es así, entonces puedo usarlo. De lo contrario, se genera una excepción y el programa creará la base de datos. (O use declaraciones if/else, cualquiera que sea mejor).

Creé un script de prueba para ver si mi lógica es correcta pero no funciona. Cuando creo la instrucción try, solo crea una nueva base de datos en lugar de verificar si ya existe. La próxima vez que ejecuto el script, me sale un error de que la tabla ya existe, incluso si intenté capturar la excepción. (No he usado try/except before pero supuse que este es un buen momento para aprender).

¿Hay algún buen tutorial para usar SQLite operacionalmente o alguna sugerencia sobre cómo codificar esto? Revisé el tutorial de pysqlite y otros que encontré pero no abordan esto.

+2

Podría tal vez publicar ese guión suyo que parece no funcionar? – kender

Respuesta

12

AFAIK una base de datos SQLITE es solo un archivo. Para verificar si existe la base de datos, verifique la existencia del archivo.

Cuando abre una base de datos SQLITE, creará automáticamente una si el archivo que la respalda no está en su lugar.

Si intenta abrir un archivo como una base de datos sqlite3 que no es una base de datos, obtendrá esto:

"sqlite3.DatabaseError: archivo está cifrado o no es una base de datos"

a fin de comprobar para ver si el archivo existe y también asegúrese de intentar capturar la excepción en caso de que el archivo no sea una base de datos sqlite3

+7

Todavía hay una pequeña posibilidad de que el archivo no sea una base de datos SQLite adecuada con el esquema esperado. Sugiero que haga una consulta además de verificar la existencia del archivo. –

+0

Es una gran posibilidad que hubiera pensado ... ¡comprobando la existencia del archivo! = Existencia de la base de datos. – snowcrash09

3

Hacer el SQL en general es horrible en cualquier idioma que haya recogido. SQLalchemy ha demostrado ser más fácil de usar porque la consulta real y la confirmación con él es muy limpia y está ausente de problemas.

A continuación se detallan algunos pasos básicos para usar sqlalchemy en su aplicación. Para obtener más detalles, consulte la documentación.

  • proporcionar definiciones de tabla y crear ORM-mappings
  • base de datos de carga
  • pregunto para crear tablas de las definiciones (no lo hará si es que existen)
  • crear fabricante de la sesión (opcional)
  • crear sesión

Después de crear una sesión, puede comprometerse y consulta de la base de datos.

4
  • Sqlite no arroja una excepción si crea una nueva base de datos con el mismo nombre, simplemente se conectará a ella. Como sqlite es una base de datos basada en archivos, le sugiero que solo compruebe la existencia del archivo.
  • Acerca de su segundo problema, para comprobar si ya se ha creado una tabla, simplemente tome la excepción. Se genera una excepción "sqlite3.OperationalError: table TEST already exists" si la tabla ya existe.
import sqlite3 
import os 
database_name = "newdb.db" 
if not os.path.isfile(database_name): 
    print "the database already exist" 
db_connection = sqlite3.connect(database_name) 
db_cursor = db_connection.cursor() 
try: 
    db_cursor.execute('CREATE TABLE TEST (a INTEGER);') 
except sqlite3.OperationalError, msg: 
    print msg 
5

Como @diciu señaló, el archivo de base de datos será creada por sqlite3.connect. Si usted quiere tomar una acción especial cuando el archivo no está allí, usted tiene que comprobar explícitamente existencia:

import os 
import sqlite3 
if not os.path.exists(mydb_path): 
    #create new DB, create table stocks 
    con = sqlite3.connect(mydb_path) 
    con.execute('''create table stocks 
     (date text, trans text, symbol text, qty real, price real)''') 
else: 
    #use existing DB 
    con = sqlite3.connect(mydb_path) 
... 
+0

Puede que quiera hacer 'os.path.isfile' en lugar de' os.path.exists', según http://stackoverflow.com/a/84173/198348 –

7

SQLite crea automáticamente un archivo de base de datos la primera vez que intenta utilizarlo. Las instrucciones SQL para crear tablas pueden usar IF NOT EXISTS para hacer que los comandos solo tengan efecto si la tabla no se ha creado. De esta forma no es necesario verificar previamente la existencia de la base de datos: SQLite puede encargarse de eso.

Lo principal que todavía me preocuparía es que ejecutar CREATE TABLE IF EXISTS por cada transacción web (por ejemplo) sería ineficiente; puede evitarlo haciendo que el programa mantenga una variable (en memoria) que diga si ha creado la base de datos hoy, por lo que ejecuta el script CREATE TABLE una vez por ejecución. Esto aún le permitiría eliminar la base de datos y comenzar de nuevo durante la depuración.

29

No haga que esto sea más complejo de lo necesario. Las grandes bases de datos independientes tienen requisitos complejos de configuración y configuración. SQLite es solo un archivo al que accede con SQL, es mucho más simple.

Haga lo siguiente.

  1. añadir una tabla a la base de datos de "componentes" o "versiones" o "Configuración" o "Release" o algo así administrativa.

    CREAR REVISIÓN DE TABLA ( RELEASE_NUMBER CHAR (20) );

  2. En su aplicación, conéctese a su base de datos normalmente.

  3. Ejecute una consulta simple en la tabla de revisión. Esto es lo que puede suceder.
    • La consulta no se ejecuta: su base de datos no existe, por lo tanto, ejecute una serie de instrucciones CREATE para compilarla.
    • La consulta tiene éxito pero no devuelve filas o el número de versión es inferior al esperado: su base de datos existe, pero está desactualizada. Debe migrar de esa versión a la versión actual. Con suerte, tiene una secuencia de instrucciones DROP, CREATE y ALTER para hacer esto.
    • La consulta se realiza correctamente y el número de versión es el valor esperado. No haga nada más, su base de datos está configurada correctamente.
0

Sí, me bombardear el problema. Todo lo que tenía que hacer era verificar el archivo y capturar el IOError si no existía.

Gracias por todas las demás respuestas. Pueden ser útiles en el futuro.

2

Ver esta solución en SourceForge que cubre su pregunta de manera tutorial, con el código fuente instructiva:

y_serial.Módulo py :: almacén Objetos Python con SQLite

"Serialización + persistencia :: en unas pocas líneas de código, comprime y anota objetos de Python en SQLite, luego los recupera cronológicamente por palabras clave sin ningún SQL. El más útil es" estándar " módulo para una base de datos para almacenar datos sin esquema ".

http://yserial.sourceforge.net