instalar - Usando SQLite en un programa de Python
sqlite3 python install (8)
Como señaló @diciu, 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)
...
Creé un módulo Python que crea y rellena varias tablas 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 por el uso de SQLite de forma lineal en lugar de cómo usarlo en la producción.
Lo que intento hacer es verificar el 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.
Hacer SQL en general es horrible en cualquier idioma que he 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 utilizar sqlalchemy en su aplicación. Para obtener más detalles, consulte la documentación.
- proporcionar definiciones de tablas y crear correlaciones de ORM
- cargar base de datos
- pídalo para crear tablas a partir de las definiciones (no lo hará si existen)
- crear creador de sesiones (opcional)
- crear sesión
Después de crear una sesión, puede enviar y consultar desde la base de datos.
SQLite crea automáticamente el archivo de base de datos la primera vez que intenta usarlo. 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 de lo que todavía me preocuparía es que la ejecución de CREATE TABLE IF EXISTS
para 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.
No hagas esto 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.
Haz lo siguiente.
Agregue una tabla a su base de datos para "Componentes" o "Versiones" o "Configuración" o "Versión" o algo administrativo como ese.
CREATE TABLE REVISION (RELEASE_NUMBER CHAR (20));
En su aplicación, conéctese a su base de datos normalmente.
- Ejecute una consulta simple contra 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 tiene éxito y el número de versión es el valor esperado. No haga nada más, su base de datos está configurada correctamente.
Sí, estaba aniquilando 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.
Vea esta solución en SourceForge que cubre su pregunta de manera tutorial, con un código fuente instructivo:
y_serial.py module :: warehouse Python objects with 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. Módulo" estándar "más útil para que una base de datos almacene datos sin esquema.
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á una automáticamente si el archivo que la respalda no está en su lugar.
Si intentas abrir un archivo como una base de datos sqlite3 que NO es una base de datos, obtendrás esto:
"sqlite3.DatabaseError: el archivo está encriptado o no es una base de datos"
así que verifique 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
- Sqlite no lanza 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.
- Sobre su segundo problema, para verificar si ya se ha creado una tabla, solo 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