Persistencia de datos de Python - Módulo Sqlite3

Una de las principales desventajas de los archivos CSV, JSON, XML, etc., es que no son muy útiles para el acceso aleatorio y el procesamiento de transacciones porque en gran medida no están estructurados. Por tanto, resulta muy difícil modificar los contenidos.

Estos archivos planos no son adecuados para el entorno cliente-servidor, ya que carecen de capacidad de procesamiento asincrónico. El uso de archivos de datos no estructurados genera redundancia e inconsistencia de datos.

Estos problemas pueden superarse utilizando una base de datos relacional. Una base de datos es una colección organizada de datos para eliminar la redundancia y la inconsistencia y mantener la integridad de los datos. El modelo de base de datos relacional es muy popular.

Su concepto básico es organizar los datos en una tabla de entidades (llamada relación). La estructura de la tabla de entidades proporciona un atributo cuyo valor es único para cada fila. Tal atributo se llama'primary key'.

Cuando la clave principal de una tabla aparece en la estructura de otras tablas, se llama 'Foreign key'y esto forma la base de la relación entre los dos. Basado en este modelo, hay muchos productos RDBMS populares disponibles actualmente:

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

SQLite es una base de datos relacional ligera que se utiliza en una amplia variedad de aplicaciones. Es un motor de base de datos transaccional SQL autónomo, sin servidor, sin configuración. Toda la base de datos es un solo archivo, que se puede colocar en cualquier lugar del sistema de archivos. Es un software de código abierto, con una huella muy pequeña y sin configuración. Se usa popularmente en dispositivos integrados, IOT y aplicaciones móviles.

Todas las bases de datos relacionales usan SQL para manejar datos en tablas. Sin embargo, antes, cada una de estas bases de datos solía estar conectada con la aplicación Python con la ayuda del módulo Python específico para el tipo de base de datos.

Por lo tanto, hubo una falta de compatibilidad entre ellos. Si un usuario quisiera cambiar a un producto de base de datos diferente, resultaría difícil. Este problema de incompatibilidad se solucionó al plantear la 'Propuesta de mejora de Python (PEP 248)' para recomendar una interfaz coherente para las bases de datos relacionales conocidas como DB-API. Las últimas recomendaciones se llamanDB-APIVersión 2.0. (PEP 249)

La biblioteca estándar de Python consiste en el módulo sqlite3 que es un módulo compatible con DB-API para manejar la base de datos SQLite a través del programa Python. Este capítulo explica la conectividad de Python con la base de datos SQLite.

Como se mencionó anteriormente, Python tiene soporte incorporado para la base de datos SQLite en forma de módulo sqlite3. Para otras bases de datos, el módulo Python compatible con DB-API deberá instalarse con la ayuda de la utilidad pip. Por ejemplo, para usar la base de datos MySQL necesitamos instalar el módulo PyMySQL.

pip install pymysql

Se recomiendan los siguientes pasos en DB-API:

  • Establecer conexión con la base de datos usando connect() función y obtener el objeto de conexión.

  • Llamada cursor() método del objeto de conexión para obtener el objeto del cursor.

  • Forme una cadena de consulta compuesta por una declaración SQL que se ejecutará.

  • Ejecute la consulta deseada invocando execute() método.

  • Cierra la conexión.

import sqlite3
db=sqlite3.connect('test.db')

Aquí, db es el objeto de conexión que representa test.db. Tenga en cuenta que esa base de datos se creará si aún no existe. El objeto de conexión db tiene los siguientes métodos:

No Señor. Métodos y descripción
1

cursor():

Devuelve un objeto Cursor que usa esta conexión.

2

commit():

Compromete explícitamente cualquier transacción pendiente a la base de datos.

3

rollback():

Este método opcional hace que una transacción se retrotraiga al punto de partida.

4

close():

Cierra la conexión a la base de datos de forma permanente.

Un cursor actúa como un identificador para una consulta SQL dada, lo que permite la recuperación de una o más filas del resultado. El objeto cursor se obtiene de la conexión para ejecutar consultas SQL utilizando la siguiente declaración:

cur=db.cursor()

El objeto cursor tiene los siguientes métodos definidos:

No Señor Métodos y descripción
1

execute()

Ejecuta la consulta SQL en un parámetro de cadena.

2

executemany()

Ejecuta la consulta SQL usando un conjunto de parámetros en la lista de tuplas.

3

fetchone()

Obtiene la siguiente fila del conjunto de resultados de la consulta.

4

fetchall()

Obtiene todas las filas restantes del conjunto de resultados de la consulta.

5

callproc()

Llama a un procedimiento almacenado.

6

close()

Cierra el objeto cursor.

El siguiente código crea una tabla en test.db: -

import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()

La integridad de los datos deseada en una base de datos se logra mediante commit() y rollback()métodos del objeto de conexión. La cadena de consulta SQL puede tener una consulta SQL incorrecta que puede generar una excepción, que debe manejarse correctamente. Para eso, la instrucción execute () se coloca dentro del bloque try. Si tiene éxito, el resultado se guarda de forma persistente utilizando el método commit (). Si la consulta falla, la transacción se deshace mediante el método rollback ().

El siguiente código ejecuta la consulta INSERT en la tabla de estudiantes en test.db.

import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
   cur=db.cursor()
   cur.execute(qry)
   db.commit()
print ("record added successfully")
except:
   print ("error in query")
   db.rollback()
db.close()

Si desea que los datos en la cláusula de valores de la consulta INSERT sean proporcionados dinámicamente por la entrada del usuario, use la sustitución de parámetros como se recomienda en Python DB-API. Los ? El carácter se utiliza como marcador de posición en la cadena de consulta y proporciona los valores en forma de tupla en el método execute (). El siguiente ejemplo inserta un registro utilizando el método de sustitución de parámetros. El nombre, la edad y las notas se toman como entrada.

import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,a,m))
   db.commit()
   print ("one record added successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

El módulo sqlite3 define el executemany()método que puede agregar varios registros a la vez. Los datos que se agregarán deben incluirse en una lista de tuplas, y cada tupla debe contener un registro. El objeto de lista es el parámetro del método executemany (), junto con la cadena de consulta. Sin embargo, el método executemany () no es compatible con algunos de los otros módulos.

los UPDATELa consulta generalmente contiene una expresión lógica especificada por la cláusula WHERE. La cadena de consulta en el método execute () debe contener una sintaxis de consulta UPDATE. Para actualizar el valor de 'edad' a 23 para name = 'Anil', defina la cadena de la siguiente manera:

qry="update student set age=23 where name='Anil';"

Para que el proceso de actualización sea más dinámico, utilizamos el método de sustitución de parámetros como se describe anteriormente.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (a, nm))
   db.commit()
   print("record updated successfully")
except:
   print("error in query")
   db.rollback()
db.close()

De manera similar, la operación DELETE se realiza llamando al método execute () con una cadena que tiene la sintaxis de consulta DELETE de SQL. De paso,DELETE consulta también suele contener un WHERE cláusula.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,))
   db.commit()
   print("record deleted successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

Una de las operaciones importantes en una tabla de base de datos es la recuperación de registros. SQL proporcionaSELECTconsulta para el propósito. Cuando se proporciona una cadena que contiene la sintaxis de consulta SELECT al método execute (), se devuelve un objeto de conjunto de resultados. Hay dos métodos importantes con un objeto de cursor mediante los cuales se pueden recuperar uno o varios registros del conjunto de resultados.

fetchone ()

Obtiene el siguiente registro disponible del conjunto de resultados. Es una tupla que consta de valores de cada columna del registro obtenido.

fetchall ()

Obtiene todos los registros restantes en forma de lista de tuplas. Cada tupla corresponde a un registro y contiene valores de cada columna de la tabla.

El siguiente ejemplo enumera todos los registros en la tabla de estudiantes

import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
   record=cur.fetchone()
   if record==None:
      break
   print (record)
db.close()

Si planea utilizar una base de datos MySQL en lugar de una base de datos SQLite, debe instalar PyMySQLmódulo como se describe arriba. Todos los pasos en el proceso de conectividad de la base de datos son los mismos, dado que la base de datos MySQL está instalada en un servidor, la función connect () necesita la URL y las credenciales de inicio de sesión.

import pymysql
con=pymysql.connect('localhost', 'root', '***')

Lo único que puede diferir de SQLite son los tipos de datos específicos de MySQL. De manera similar, cualquier base de datos compatible con ODBC se puede usar con Python instalando el módulo pyodbc.