Una introducció a SQLite amb Python

En aquest article, patearem els pneumàtics de SQLite. Aprendrem a utilitzar SQLite mitjançant una biblioteca de Python anomenada sqlite3. Al final, explorarem algunes funcions més avançades que ofereix sqlite3 per facilitar-nos la feina.

Nota: abans de començar, és bo estar familiaritzat amb SQL. Si no ho sou, potser voldreu fer una ullada Simplement SQL.

Què és SQLite?

El lema de SQLite és: “Small. Ràpid. Fiable. Trieu-ne tres”.

SQLite és una biblioteca de bases de dades incrustada escrita en C. És possible que estigueu familiaritzat amb altres tecnologies de bases de dades com MySQL o PostgreSQL. Aquests utilitzen un enfocament client-servidor: la base de dades s’instal·la com a servidor i després s’utilitza un client per connectar-s’hi. SQLite és diferent: es coneix com a incrustat base de dades, perquè s’inclou en un programa com a biblioteca. Totes les dades s’emmagatzemen en un fitxer, normalment amb a .db extensió — i teniu funcions que us permeten executar sentències SQL o fer qualsevol altra operació a la base de dades.

La solució d’emmagatzematge basada en fitxers també ofereix accés concurrent, el que significa que diversos processos o fils poden accedir a la mateixa base de dades. D’acord, quins són els usos de SQLite? És apte per a qualsevol tipus d’aplicació?

Bé, hi ha alguns casos en què SQLite sobresurt:

  • En estar inclòs a la majoria de sistemes operatius mòbils, com Android i iOS, SQLite podria ser una opció perfecta si voleu un autònom i sense servidor solució d’emmagatzematge de dades.

  • En lloc d’utilitzar fitxers CSV enormes, podeu aprofitar el poder de SQL i poseu totes les vostres dades en una única base de dades SQLite.

  • SQLite es pot utilitzar per emmagatzemar dades de configuració de les vostres aplicacions. De fet, SQLite és un 35% més ràpid que un sistema basat en fitxers com un fitxer de configuració.

D’altra banda, quines són algunes de les raons per no triar SQLite?

  • A diferència de MySQL o PostgreSQL, SQLite no té funcionalitats multiusuari.

  • SQLite segueix sent una solució d’emmagatzematge de dades basada en fitxers, no un servei. No el podeu gestionar com a procés, no el podeu iniciar o aturar, ni gestionar l’ús dels recursos.

La interfície de Python a SQLite

Com he dit a la introducció, SQLite és una biblioteca C. Tanmateix, hi ha interfícies escrites en molts idiomes, inclòs Python. Té sqlite3 El mòdul proporciona una interfície SQL i requereix almenys SQLite 3.7.15.

El genial és això sqlite3 ve amb Python, de manera que no cal que instal·leu res.

Com començar amb sqlite3

És hora de codificar! En aquesta primera part, crearem una base de dades bàsica. El primer que cal fer és crear una base de dades i connectar-hi:

import sqlite3
dbName = 'database.db'

try:
  conn = sqlite3.connect(dbName)
  cursor = conn.cursor()
  print("Database created!")

except Exception as e:
  print("Something bad happened: ", e)
  if conn:
    conn.close()

A la línia 1, importem el sqlite3 biblioteca. Després, dins a try/except bloc de codi, cridem sqlite3.connect() per inicialitzar una connexió a la base de dades. Si tot va bé, conn serà una instància de la Connection objecte. Si el try falla, imprimim l’excepció rebuda i es tanca la connexió a la base de dades. Tal com s’indica a la documentació oficial, cada base de dades SQLite oberta està representada per a Connection objecte. Cada vegada que hem d’executar una ordre SQL, el Connection L’objecte té un mètode anomenat cursor(). A les tecnologies de bases de dades, un cursor és una estructura de control que permet recórrer els registres d’una base de dades.

Ara, si executem aquest codi hauríem d’obtenir la següent sortida:

> Database created!

Si mirem la carpeta on hi ha el nostre script de Python, hauríem de veure un fitxer nou anomenat database.db. Aquest fitxer ha estat creat automàticament per sqlite3.

Crear, llegir i modificar registres

En aquest punt, estem preparats per crear una taula nova, afegir les primeres entrades i executar ordres SQL com ara SELECT, UPDATE or DROP.

Per crear una taula, només hem d’executar una instrucció SQL senzilla. En aquest exemple, crearem una taula d’estudiants que contindrà les dades següents:

id nom cognom
1 Joan Smith
2 Lucy Jacobs
3 Esteve taylor

Després de la print("Database created!") línia, afegiu això:


create_query = '''CREATE TABLE IF NOT EXISTS student(
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  surname TEXT NOT NULL);
  '''
cursor.execute(create_query)
print("Table created!")


cursor.execute("INSERT INTO student VALUES (1, 'John', 'Smith')")
print("Insert #1 done!")
cursor.execute("INSERT INTO student VALUES (2, 'Lucy', 'Jacobs')")
print("Insert #2 done!")
cursor.execute("INSERT INTO student VALUES (3, 'Stephan', 'Taylor')")
print("Insert #3 done!")
conn.commit()
conn.close()

Creem una taula i anomenem el cursor.execute() mètode, que s’utilitza quan volem executar una sola instrucció SQL.

Després, fem un INSERT per a cada fila que volem afegir. Un cop fets tots els nostres canvis, truquem conn.commit() per enviar la transacció pendent a la base de dades. Sense trucar al commit() mètode, qualsevol canvi pendent a la base de dades es perdrà. Finalment, tanquem la connexió a la base de dades cridant al conn.close() mètode.

D’acord, ara consultem la nostra base de dades! Necessitarem una variable per desar els resultats de la nostra consulta, així que desem el resultat de cursor.execute() a una variable anomenada records:

records = cursor.execute("SELECT * FROM student")
for row in findrecords:
  print(row)

Després d’executar això, veurem tots els registres a stdout:

(1, 'John', 'Smith')
(2, 'Lucy', 'Jacobs')
(3, 'Stephan', 'Taylor')

En aquest punt, potser haureu notat que, dins del cursor.execute() mètode, posem l’ordre SQL que s’ha d’executar. Res canvia a la sintaxi de Python si volem executar una altra ordre SQL com UPDATE or DROP.

Els marcadors de posició

cursor.execute() El mètode necessita una cadena com a argument. A la secció anterior, vam veure com inserir dades a la nostra base de dades, però tot estava codificat. Què passa si necessitem emmagatzemar a la base de dades alguna cosa que es troba en una variable? Per aquesta raó, sqlite3 té algunes coses fantàstiques anomenades marcadors de posició. Marcadors de posició ens permet utilitzar la substitució de paràmetres, que farà que inserir una variable en una consulta sigui molt més fàcil.

Vegem aquest exemple:

def insert_command(conn, student_id, name, surname):
  command = 'INSERT INTO student VALUES (?, ?, ?)'
  cur = conn.cursor()
  cur.execute(command, (student_id, name, surname, ))
  conn.commit()

Creem un mètode anomenat insert_command(). Aquest mètode pren quatre arguments: el primer és a Connection exemple, i els altres tres s’utilitzaran a la nostra comanda SQL.

Cadascú ? dins del command variable representa un marcador de posició. Això vol dir que, si truqueu al insert_command funcionar amb student_id=1, name="Jason" i surname="Green"te INSERT declaració esdevindrà INSERT INTO student VALUES(1, 'Jason', 'Green').

Quan cridem el execute() funció, passem la nostra comanda i totes les variables que seran substituïdes pels marcadors de posició. A partir d’ara, cada vegada que necessitem inserir una fila a la taula de l’estudiant, anomenem el insert_command() mètode amb els paràmetres requerits.

Transaccions

Fins i tot si no sou nou a la definició d’una transacció, permeteu-me que us faci un breu resum de la seva importància. TÉ transacció és una seqüència d’operacions realitzades en una base de dades que lògicament es tracta com una unitat única.

El benefici més important d’una transacció és garantir la integritat de les dades. Pot ser inútil en l’exemple que hem presentat anteriorment, però quan tractem més dades emmagatzemades en diverses taules, les transaccions marquen la diferència.

De Python sqlite3 El mòdul inicia una transacció abans que execute() i executemany() s’executi INSERT, UPDATE, DELETEor REPLACE declaracions. Això implica dues coses:

  • Hem de tenir cura de trucar al commit() mètode. Si trucem Connection.close() sense fer a commit()es perdran tots els canvis que hem fet durant la transacció.
  • No podem obrir una transacció en el mateix procés amb BEGIN.

La solució? Gestioneu les transaccions de manera explícita.

Com? Mitjançant la crida de funció sqlite3.connect(dbName, isolation_level=None) en lloc de sqlite3.connect(dbName). Per fixació isolation_level a Noneobliguem sqlite3 no obrir mai transaccions implícitament.

El codi següent és una reescriptura del codi anterior, però amb l’ús explícit de les transaccions:

import sqlite3
dbName = 'database.db'

def insert_command(conn, student_id, name, surname):
  command = 'INSERT INTO student VALUES (?, ?, ?)'
  cur = conn.cursor()
  cur.execute("BEGIN")
  try:
    cur.execute(command, (student_id, name, surname, ))
    cur.execute("COMMIT")
  except conn.Error as e:
    print("Got an error: ", e)
    print("Aborting...")
    cur.execute("ROLLBACK")

conn = sqlite3.connect(dbName, isolation_level=None)
cursor = conn.cursor()
print("Database created!")


create_query = '''CREATE TABLE IF NOT EXISTS student(
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  surname TEXT NOT NULL);
  '''
cursor.execute(create_query)
print("Table created!")


insert_command(conn , 1, 'John', 'Smith')
insert_command(conn , 2, 'Lucy', 'Jacobs')
insert_command(conn , 3, 'Stephan', 'Taylor')
insert_command(conn , 4, 'Joseph', 'Random')
findRecords = cursor.execute("SELECT * FROM student")
for row in findRecords:
  print(row)

conn.close()

Conclusió

Espero que ara tingueu una bona comprensió de què és SQLite, com podeu utilitzar-lo per als vostres projectes Python i com funcionen algunes de les seves funcions avançades. La gestió explícita de les transaccions pot ser una mica complicada al principi, però sens dubte us pot ajudar a treure el màxim profit sqlite3.

Lectura relacionada:

Leave a Comment

Your email address will not be published. Required fields are marked *