Usando SQLite en un progtwig Python

He creado un módulo de Python que crea y completa varias tablas SQLite. Ahora, quiero usarlo en un progtwig pero no sé cómo llamarlo correctamente. Todos los tutoriales que he encontrado son esencialmente “en línea”, es decir, explican el uso de SQLite de forma lineal en lugar de cómo usarlo realmente en producción.

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

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

¿Hay buenos tutoriales para usar SQLite operacionalmente o alguna sugerencia sobre cómo codificar esto? He revisado el tutorial de pysqlite y otros que encontré pero no abordan esto.

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

Cuando abre una base de datos SQLITE, creará una automáticamente 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: el archivo está cifrado o no es una base de datos”

así que compruebe si el archivo existe y asegúrese de intentar detectar la excepción en caso de que el archivo no sea una base de datos sqlite3

SQLite crea automáticamente el archivo de base de datos la primera vez que intenta usarlo. Las sentencias de SQL para crear tablas pueden usar IF NOT EXISTS para que los comandos solo tengan efecto si la tabla no se ha creado. De esta manera, no es necesario verificar de antemano la existencia de la base de datos: SQLite puede encargarse de eso por usted.

Lo más importante de lo que aún estaría preocupado es que la ejecución de CREATE TABLE IF EXISTS para cada transacción web (por ejemplo) sería ineficiente; puede evitar que el progtwig mantenga una variable (en memoria) que indique si ha creado la base de datos hoy, por lo que ejecuta el script CREATE TABLE una vez por ejecución. Esto todavía le permitirá eliminar la base de datos y comenzar de nuevo durante la depuración.

Como @diciu señaló, el archivo de base de datos será creado por sqlite3.connect . Si desea realizar una acción especial cuando el archivo no está allí, deberá verificar explícitamente la 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) ... 
  • Sqlite no lanza una excepción si crea una nueva base de datos con el mismo nombre, simplemente se conectará a ella. Dado que sqlite es una base de datos basada en archivos, le sugiero que verifique la existencia del archivo.
  • Acerca de su segundo problema, para verificar si una tabla ya se ha creado, simplemente detecte la excepción. Se lanza una excepción “sqlite3.OperationalError: table TEST ya existe” 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 

Hacer SQL en general es horrible en cualquier idioma que haya aprendido. SQLalchemy ha demostrado ser más fácil de usar porque la consulta y el compromiso reales son muy claros y están exentos de problemas.

Aquí hay algunos pasos básicos para utilizar realmente sqlalchemy en su aplicación, puede encontrar mejores detalles en la documentación.

  • proporcionar definiciones de tablas y crear mapeos ORM
  • cargar base de datos
  • pídale que cree tablas a partir de las definiciones (no lo hará si existen)
  • crear creador de sesión (opcional)
  • crear sesión

Después de crear una sesión, puede confirmar y consultar desde la base de datos.

Vea esta solución en SourceForge que cubre su pregunta de manera tutorial, con un código fuente instructivo:

y_serial.py module :: warehouse objetos de Python con SQLite

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

http://yserial.sourceforge.net

Sí, estaba saciando el problema. Todo lo que tenía que hacer era buscar el archivo y detectar el error IOError si no existía.

Gracias por todas las otras respuestas. Pueden ser útiles en el futuro.