domingo, abril 23, 2017

Usando Sqlite3 con Python. Comandos basicos.

Pre-requisitos

Necesitaremos tener instalado:

  • sqlite-3
  • python
  • modulo sqlite3 para python


Verificar que funciona todo correctamente consultando la versión:

#!/usr/bin/python 

 import sqlite3 

 print sqlite3.version 
 print sqlite3.sqlite_version


Usando control de errores,  si la BBDD no existe la creará:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3 as sl
import sys

con = None

try:
        con = sl.connect('prueba.db')

        cur = con.cursor()
        cur.execute('SELECT SQLITE_VERSION()')

        data = cur.fetchone()

        print "SQLite version: %s" % data

except sl.Error, e:

        print "Error %s:" % e.args[0]
        sys.exit(1)

finally:

        if con:
                con.close()


Usando la cláusula "with", si la BBDD no existe la creará, además al terminar se cerrará la conexión:

import sqlite3 as sl
import sys

con = sl.connect('prueba.db')

with con:


        cur = con.cursor()
        cur.execute('SELECT SQLITE_VERSION()')

        data = cur.fetchone()

        print "SQLite version: %s" % data

Insertando datos

Creamos una tabla e insertamos datos:

con = sl.connect('inversiones.db')

with con:

        cur = con.cursor()

        cur.execute("DROP TABLE IF EXISTS MateriasPrimas")
        cur.execute("CREATE TABLE MateriasPrimas(Id INT, Symbol TEXT, Name TEXT, PriceB REAL, PriceS REAL)")

        cur.execute("INSERT INTO MateriasPrimas VALUES(1,'CL','Petroleo',49.66,49.62)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(2,'XAU','Oro',1285.62,1284.16)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(3,'NG','Gas Natural',3.196,3.192)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(4,'XAG','Plata',17.959,17.930)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(5,'CC','Cacao',1852,1844)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(6,'KC','Cafe',130.43,129.62)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(7,'ZC','Maiz',357.61,356.12)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(8,'ZW','Trigo',405.38,404.88)")

Verificando:

$ sqlite3 inversiones.db

sqlite> .tables
MateriasPrimas

sqlite> .mode column
sqlite> .headers on
sqlite> select * from MateriasPrimas;
Id          Symbol      Name        PriceB      PriceS
----------  ----------  ----------  ----------  ----------
1           CL          Petroleo    49.66       49.62
2           XAU         Oro         1285.62     1284.16
3           NG          Gas Natura  3.196       3.192
4           XAG         Plata       17.959      17.93
5           CC          Cacao       1852.0      1844.0
6           KC          Cafe        130.43      129.62
7           ZC          Maiz        357.61      356.12
8           ZW          Trigo       405.38      404.88

Insertando un array:

materiasprimas = (
        (1,'CL','Petroleo',49.66,49.62),
        (2,'XAU','Oro',1285.62,1284.16),
        (3,'NG','Gas Natural',3.196,3.192),
        (4,'XAG','Plata',17.959,17.930),
        (5,'CC','Cacao',1852,1844),
        (6,'KC','Cafe',130.43,129.62),
        (7,'ZC','Maiz',357.61,356.12),
        (8,'ZW','Trigo',405.38,404.88)
)

con = sl.connect('inversiones.db')

with con:
        cur = con.cursor()

        cur.execute("DROP TABLE IF EXISTS MateriasPrimas")
        cur.execute("CREATE TABLE MateriasPrimas(Id INT, Symbol TEXT, Name TEXT, PriceB REAL, PriceS REAL)")
        cur.executemany("INSERT INTO MateriasPrimas VALUES(?,?,?,?,?)",materiasprimas)

Podemos declarar una columna como "INTEGER PRIMARY KEY" y se generará una columna con autoincremento:

materiasprimas = (
        ('XAU','Oro',1285.62,1284.16),
        ('XAG','Plata',17.959,17.930),
        ('NG','Gas Natural',3.196,3.192),
        ('CC','Cacao',1852,1844),
        ('KC','Cafe',130.43,129.62),
        ('CL','Petroleo',49.66,49.62),
        ('ZC','Maiz',357.61,356.12),
        ('ZW','Trigo',405.38,404.88)
)

con = sl.connect('inversiones.db')

with con:

        cur = con.cursor()

        cur.execute("DROP TABLE IF EXISTS MateriasPrimas")
        cur.execute("CREATE TABLE MateriasPrimas(Id INTEGER PRIMARY KEY, Symbol TEXT, Name TEXT, PriceB REAL, PriceS REAL)")
        cur.executemany("INSERT INTO MateriasPrimas(Symbol,Name,PriceB,PriceS) VALUES(?,?,?,?)",materiasprimas)

Leyendo datos

Para leer datos, se puede usar el nombre de la columna o su posición:

con = sl.connect('inversiones.db')

with con:

    con.row_factory = sl.Row

    cur = con.cursor()

    cur.execute("SELECT * FROM MateriasPrimas")

    rows = cur.fetchall()

    for row in rows:
        print "%s %s %s %s %s" % (row["Id"], row ["Symbol"], row["Name"], row[3], row[4])

Modificando datos

Podemos modificar datos al igual que en cualquier BBDD:

uSymbol = 'CL'
uPriceS = 49.50

con = sl.connect('inversiones.db')

with con:

    cur = con.cursor()

    cur.execute("UPDATE MateriasPrimas SET PriceS=? WHERE Symbol=?",(uPriceS,uSymbol))
    con.commit()

    print "Columnas modificadas: %d" % cur.rowcount


Usando "bind" variables

Podemos definir una consulta y usarla múltiples veces con distintos valores usando variables BIND:

uSymbol = 'CL'

con = sl.connect('inversiones.db')

with con:

    cur = con.cursor()

    cur.execute("SELECT Name, PriceB, PriceS FROM MateriasPrimas WHERE Symbol=:Symbol",{"Symbol":uSymbol})
    con.commit()

    row = cur.fetchone()
    print row