Mostrando las entradas con la etiqueta sqlite3. Mostrar todas las entradas
Mostrando las entradas con la etiqueta sqlite3. Mostrar todas las entradas

miércoles, 15 de enero de 2014

Tutorial SQlite3 SELECT y WHERE

En esta ocasión aprenderemos como hacer uso de SELECT junto con WHERE usando la lógica de selección que aprendimos en el tutorial pasado:

Enlace

Primero que nada vamos a abrir una shell de SQLite y vamos a crear una base de datos:

sqlite3 Ejemplo.db

Y pegamos:


1
2
3
4
5
6
7
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE "Users" (id INTEGER,nombre TEXT,nucleo TEXT,sistema TEXT, version TEXT);
INSERT INTO "Users" VALUES(1,'atheyus','linux','ubuntu','14.04');
INSERT INTO "Users" VALUES(3,'usuario3','linux','gentoo',NULL);
INSERT INTO "Users" VALUES(4,'usuario4','darwin','MacOSX','Lion');
COMMIT;

Bien ya tenemos una tabla donde trabajar,para una selección normal vamos a usar:

SELECT * FROM Users;
De esta manera nos devuleve todas las columnas (*),de Users,si queremos un filtrado,por ejemplo queremos los nombres solamente pedimos el nombre:

SELECT nombre FROM Users;

Si queremos el nombre y el sistema usamos una coma:

SELECT nombre,sistema FROM Users;

Si queremos un orden podemos ordenar basado en una columna,usando la orden ORDER BY:

SELECT nucleo FROM Users ORDER BY nucleo;

Al final podemos agregar si lo queremos en modo ascendente ASC o descendente DESC;

SELECT nucleo FROM Users ORDER BY nucleo DESC;

Podemos limitar el numero de la salida de datos con el comando LIMIT:

Veamos como mostrar solo dos resultados:

SELECT nucleo FROM Users ORDER BY nucleo LIMIT 2;

Podemos filtrar el resultado para que solo muestre dos columnas pero se salte la primera,vamos a hacer esto:

Mostramos tres columnas pero nos saltamos la primera:

Primero añadimos mas usuarios para que se vea el uso bien hecho:

INSERT INTO "Users" VALUES(5,'usuario5','linux','Arch','rolling release');

INSERT INTO "Users" VALUES(6,'usuario6','linux','Debian','7');
Probamos:

SELECT * FROM Users ORDER BY nucleo;

Ahora si,para saltarnos las columnas usamos el numero a saltar primero y luego el numero a mostrar,divididos por comas:

SELECT nucleo FROM Users ORDER BY nucleo LIMIT 1,3;





Otra forma de hacer lo mismo es usando,OFFSET, seguido del numero a saltar,y LIMIT seguido del numero a mostrar:

 SELECT nucleo FROM Users ORDER BY nucleo LIMIT 3 OFFSET 1;
Usando WHERE, la clausula WHERE no es mas que un comprobador que se usa basado en respuesta lógica booleana,esto sera rápido ya que lo vimos en el tutorial pasado:

Mostrar todas las tablas con id mayor a 3:

SELECT * FROM Users WHERE id>3  ORDER BY id;
Mostrar todas las tablas con id mayor a 3 y que sea de núcleo linux:

SELECT * FROM Users WHERE id>3  AND nucleo='linux' ORDER BY id;
Mostrar todos los usuarios con nombre usuarionumero :

SELECT * FROM Users WHERE  nombre GLOB 'usuario?' ORDER BY id;

Eso es todo :D


Leer más...

martes, 14 de enero de 2014

Tutorial SQlite3 Operadores

Como prometí en el tutorial pasado vamos a aprender como se usa SELECT y WHERE de manera mas profunda,como debe de ser,pero primero que eso debemos conocer los operadores que usa SQLite3.

SQL no es un lenguaje de programación pero tiene algunos operadores similares a los de programación,por ejemplo bool,aritméticos,relacionales.

En la programación es muy muy importante saber usar bases de datos ya que es la forma mas recomendada de almacenar datos en una aplicación,sea web de escritorio móvil así que si tienen dudas de aprender SQLite yo se los recomiendo enteramente,ya que ademas de aprender a manejar un lenguaje SQL que luego nos servirá por ejemplo con MySQL,no necesita servidor y es muy portable.

Primero que nada vamos a abrir una shell para la demostración:

En terminal:

sqlite3

Los operadores son:

suma +

resta -

multiplicacion *

division /

residuo o modulo % 

Para usar estos comandos en sqlite solo tenemos que usar el comando SELECT:


1
2
3
4
5
6
7
SELECT 2+2; -- Suma

SELECT 1*2; -- Multiplicacion

SELECT 9/2; -- Division

SELECT 9%2; -- Division

En el caso de la suma,división y multiplicación es lo mas normal,en el caso del residuo muestra el resto de la multiplicación aproximada:

Por ejemplo:

9/2 = 8 

9-8 = 1

Acompañado de estos tenemos dos operadores unarios:

Sin operación + -- no-op 

Cambio negativo positivo - 

Para que esto funcione necesita estar entre paréntesis para no confundir con los operadores aritméticos:


1
2
3
4
5
SELECT +(2+2); -- no-op,no hace nada,no operation

SELECT -(2+2); -- Invierte,seria 4 ahora es -4

SELECT -(-2+-2); -- Invierte,seria -4 ahora es 4

Los operadores aritméticos pueden ser tan grandes como quieran,por ejemplo:

SELECT 1*3/2*8-8%5*88;
También tenemos los operadores booleanos,que son un poco mas usados,los cuales son:

AND -- Y

OR -- O

NOT -- No

A simple vista parecen solo traducciones del ingles al español,pero no,si tienen conocimientos en programación no es nada del otro mundo es lo mismo,el operador evalúa la expresión y regresa true si es verdadera y false si es falsa,en realidad:

En sqlite:

true es 1

y

false es 0

Veamos un ejemplo,el mas basico y ilustrativo:

SELECT 0 OR 1;
Aquí evalúa una expresión,es como si pusiéramos true or false,al haber un true (1) devuelve true(1),si fuera así:

SELECT 11 OR 10;
También devuelve true ya que son contiene valores no 0.

Veamos un false:

SELECT 0 OR 0;
Aquí mira 0 y como es 0,ve el siguiente 0 y como también es 0,devuelve 0.

El operador AND,este operador es mas estricto ya que es un Y,a lo que quiere decir que los dos valores sean true,el ejemplo mas ilustrativo:

SELECT 0 AND 1;
Devuelve false,ya que solo uno es 1,veamos un true:

SELECT 1 AND 1;

El operador NOT,este operador es una negación lógica,sirve por ejemplo para invertir el resultado:

 SELECT NOT 0 AND 1;
Devuelve true,ya que devolvería false pero al ser false se evalúa a true.

 SELECT NOT 1 AND 1;

Devuelve false,ya que normalmente devolvería true,pero como es una negación devuelve false.

Pueden pensar que son algo inútiles esos operadores,pero estos se complementan con los operadores relacionales,los cuales son:

> Mayor que

< Menor que

== o = Igual que

<> != No igual que

<= Menor o igual que

>= Mayor o igual que

Estos operadores por si mismos devuelven un bool,pero complementados con los operadores lógicos obtenemos un resultado mas especifico,vemos primero como se usan solos:


1
2
3
4
5
6
7
8
9
SELECT 1<10; -- True

SELECT 5>10; -- False

SELECT 10==10; -- True o SELECT 10=10;

SELECT 10<>10; -- False o SELECT 10!=10;

-- True es 1 y False es 0 en SQLite

Pueden hacer sus operaciones con mayor o igual y menor o igual que.

Vamos a ver un ejemplo usando todo lo aprendido hasta ahora:

SELECT 1*2==2*1 AND 1*6==3*2;

En ese caso primero multiplica 1 por 2 que da 3,luego ve si es igual a 2 por 1,que si es,después vemos un AND que hace que verifica para mostrar true que la siguiente expresión se también verdadera,que si es así.

Veamos mas ejemplos,no los explicare:

SELECT 1+4!=5 OR 4-2==2;

SELECT NOT 11+5!=51 OR 4-2==2;

Después tenemos los operadores sueltos,los cuales son operadores usados para cadenas de texto o otros cálculos,los cuales son:

|| Concatenar

GLOB Expresion estilo Unix

LIKE Expresion

IN en

Veamos la mas sencilla,concatenar:

SELECT 'Hola ' || 'Mundo!!!';
o

SELECT 'Tiempo' ||' '|| 'de' || ' ' || 'Tux';

Glob es igual que en Unix,por ejemplo los operadores * y ?:

Primero que nada abrimos una base de datos:

sqlite3 Ejemplo.db

Y pegamos lo que hicimos en el ejemplo anterior:


1
2
3
4
5
6
7
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE "Users" (id INTEGER,nombre TEXT,nucleo TEXT,sistema TEXT, version TEXT);
INSERT INTO "Users" VALUES(1,'atheyus','linux','ubuntu','14.04');
INSERT INTO "Users" VALUES(3,'usuario3','linux','gentoo',NULL);
INSERT INTO "Users" VALUES(4,'usuario4','darwin','MacOSX','Lion');
COMMIT;

Bien vamos a ver como seleccionaríamos a los usuarios de núcleo linux pero sin escribir todo:

SELECT * FROM Users WHERE nucleo GLOB 'lin*';

Es igual que en Unix,veamos el otro símbolo:

SELECT * FROM Users WHERE nucleo GLOB 'lin??';

Pueden ver ejemplos en Unix en este tutorial


El uso de LIKE,es similar pero con otros símbolos,el cual es %:

SELECT * FROM Users WHERE nucleo LIKE 'lin%';

Y el símbolo ? seria _ :

SELECT * FROM Users WHERE nucleo LIKE 'lin__';

IN,con el operador IN podemos encontrar un dato en lo que seria una lista de palabras entre paréntesis,por ejemplo:

SELECT * FROM Users WHERE nucleo IN ('linux','darwin');

Por ultimo tenemos los operadores a nivel bit los cuales son:

& AND bit

| OR bit

~ NOT bit

<< Desplazamiento a la izquierda

>> Desplazamiento a la derecha

Los números binarios tampoco son nada del otro mundo,del mundo de la informática :P,los números binarios son los que se usan en la informática el lenguaje nativo con comunicación de voltaje,estos son base dos 1 y 0,1 encendido 0 apagado,es un nivel muy muy bajo en la programación y aunque no es muy usual verlo en la programación de alto nivel o incluso en las sentencias SQL,nos esta de mas aprenderlo ya que los programas mas avanzados lo usan.

No voy a enseñar aquí como funciona eso de hecho recomiendo aprenderlo junto con C o NASM,pero bueno,vamos a ver como se usan los operadores:

Primero que nada vamos a transformar los números de notación decimal base 10,vamos a usar dos numeros en decimal con el mismo numero de digitos,10 y 15:

15 en binario es 1111

Y

10 en binario es 1010

Ahora vamos a usar el AND al igual que en la lógica común se basa en elgir los resultados true,en este caso serian los bits encendidos (a 1) y deben ser ambos:

& 1111
    1010
    1010

En este caso el resultado es 10 en decimal,1010 en binario ya que partimos los bits en uno:

1 AND 0 = 0

1 AND 1 = 1

1 AND 0 = 0

1 AND 1 = 1

En SQL:

SELECT 10&15;

Igualmente OR primero vemos el numero en binario y comparamos en uno:

SELECT 10|15;

El resultado es 15,ya que:

1 OR 0 = 1

1 OR 1 = 1

1 OR 0 = 1

1 OR 1 = 1


1111 en decimal es 15,veamos un ejemplo mas practico:

SELECT 100|99;

El resultado es 103 en decimal ya que:

100  99
1   |   1 = 1 
1   |   1 = 1
0   |   0 = 0
0   |   0 = 0
1   |   0 = 1
0   |   1 = 1
0   |   1 = 1

1100111 es 103 en decimal.

La negación se usa para invertir los resultados veamos:

SELECT ~10

Es -11 esto es un poco mas avanzado ya que usa la logica binaria,asi que les recomiendo este tutorial:

Enlace

Y este:

Enlace

El ultimo operador que nos falta es  el desplazamiento,de derecha o a izquierda:

El desplazamiento se usa agregando bits apagados a la derecha o quitandolos a la izquierda, especificados,por ejemplo desplazar a la izquierda n 2:

SELECT 10<<2 b="">

Es 40 en decimal ya que:

1010 << 2 = 101000 = 40 en decimal

En cambio :

SELECT 10>>2;
Es 2 en decimal ya que:

1010 >> 2 = 10 = 2 en decimal

Eso es todo,veremos como usar lo aprendido de manera practica en el siguiente tutorial.

Leer más...

lunes, 13 de enero de 2014

Tutorial SQlite3 Ejemplos

En la entrada pasada de estos tutoriales vimos cuales son los tipos de datos y cuales son los comandos DML y DDL,en esta ocasión vamos a ver como usar el DML y DDL para poder crear una base de datos con una tabla de datos.

Imaginemos que queremos administrar unos usuarios para nuestros pc's en el cual debemos introducir el id del usuario,el nombre el nucleo del sistema operativo y el nombre del sistema operativo.

Para eso vamos a crear una base de datos llamada Usuarios:

sqlite3 Usuarios.db

Como vemos esta vacía si mostramos las tablas:

.tables

Primero que nada vamos a crear una tabla con lo mencionado:

Para eso se usa el comando CREATE TABLE seguido del nombre de la tabla y luego entre paréntesis el contenido con esta sintaxis:

( nombre TIPO,nombre TIPO,etc)

Para lo mencionado arriba así seria:

CREATE TABLE Usuarios (id INTEGER,nombre TEXT,nucleo TEXT,sistema TEXT);

Ahora ya tenemos una tabla.para comenzar a insertar valores usamos el comando INSERT INTO la sintaxis es :

INSERT INTO Tabla VALUES (valor1,valor2);

Por ejemplo que me añadiera yo:

 INSERT INTO Usuarios VALUES (1,'atheyus','linux','ubuntu');

Esa es una inserción muy básica ya que por lo menos hubiéramos usado PRIMARY KEY pero veremos en su momento el uso mas avanzado.

Vamos a añadir mas:


INSERT INTO Usuarios VALUES (2,'usuario2','linux','arch');

INSERT INTO Usuarios VALUES (3,'usuario3','linux','gentoo');

INSERT INTO Usuarios VALUES (4,'usuario4','darwin','MacOSX');

Para ver los valores podemos usar la sentencia SELECT, la sintaxis es:

SELECT dato FROM Tabla;

Por ejemplo si queremos mostrar todos los usuarios:

SELECT nombre FROM Usuarios;


Podemos mostrar toda la información usando un asterisco (*) al estilo Unix:

SELECT * FROM Usuarios;

También podemos mejorar la interfaz,esto no es muy necesario ya que lo que importan son los datos y comandos DML y DDL ya que estos son mas de la shell de sqlite3,pero podemos usar por ejemplo:

.mode column

Junto con:

.headers on



Para que se vea muy legible, también podemos usar la que me gusta mas:

.mode line
O en menor escala podemos definir el separador por defecto(|):

.separator -

Bien eso como dije no es muy importante hablando de datos,pero es muy util para sentirse mas cómodo usando solo la shell de sqlite3.

Ya que tenemos datos en nuestra tabla,vamos a filtrar los resultados usando la clausula WHERE,que es como si fuera un if en Lenguaje de Programación(tambien existe IF en sql),sintaxis:

... WHERE condicion;

La clausula WHERE se puede usar de manera muy avanzada incluso vinculando otras tablas,usando condicionales etc WHERE y las clausulas mas importantes tendran su propio tutorial pero de momento estamos viendo ejemplos sencillos,vamos a ver como mostrar todos los datos de los usuarios que usen el núcleo linux:

 SELECT * FROM Usuarios WHERE nucleo='linux';
De ese modo mostrara todo.

Si quisiéramos mostrar solo los nombres usamos:

 SELECT nombre FROM Usuarios WHERE nucleo='linux';



De igual modo con los demás datos.

Ahora que sabemos como filtrar datos de esta manera podemos borrar parte de ellos usando el comando DELETE,por ejemplo borrar un usuario de la tabla(una columna),para ello vamos a borrar el de nombre usuario2:

DELETE FROM Usuarios WHERE nombre='usuario2'; -- No olvidar usar comillas simples
Si queremos modificar la tabla lo podemos hacer en cualquier momento usando ALTER TABLE,junto con la instrucción:

Ejemplo 1,añadir una columna a la tabla,por ejemplo que queremos añadir la version del sistema:

Nota: Para que no haya problemas con números vamos a usar una cadena de texto.

ALTER TABLE Usuarios ADD COLUMN version TEXT;
Ahora ya tenemos una nueva columna donde guardar los datos de la version,pero en todos los usuarios esta vacia,vamos a añadir datos haciendo un update con el comando UPDATE,sintaxis:

UPDATE Table SET column=valor WHERE condicion;

Por ejemplo voy a añadir que yo uso la version 13.10 y que el usuario de mac usa la version lion:


Añadir version de ubuntu a atheyus por nombre:

 UPDATE Usuarios SET version='13.10' WHERE nombre='atheyus';

 Añadir versión de Mac a usuario4 por id:

UPDATE Usuarios SET version='Lion' WHERE id=4;



El comando UPDATE no se usa solo si no hay contenido en una tabla también se usa para modificar existente,por ejemplo cuando salga Ubuntu 14.04 yo modifico mi versión:

 UPDATE Usuarios SET version='14.04' WHERE nombre='atheyus'

 Ejemplo 2,renombrar tabla.

Si quisieramos renombrar la tabla podemos hacerlo,vamos a ver como se hace.

Nuestra tabla se llama Usuarios,la sintaxis de SQL siempre es en MAYUSCULAS,no es necesario pero es recomendable para no confundir si no quisiéramos cambiar Usuarios por usuarios no seria necesario ya que SQL lo identifica pero si quisiéramos cambiar Usuarios por Users,haríamos esto:

ALTER TABLE Usuarios RENAME TO Users;
Ya casi hemos visto todos los comandos DML Y DDL,solo nos falta como borrar una tabla,para ello borrariamos todo lo visto en este tutorial,ahora nuestra tabla se llama Users,para borrarla solo usamos DROP TABLE antes del nombre de la tabla:

DROP TABLE Users;

Con eso nos quedamos sin tabla para el ejemplo y termina este tutorial :(

Nos falto CREATE INDEX.

Referencia : sqlite.org/
Leer más...

viernes, 20 de diciembre de 2013

Tutorial SQlite3 Tipos DML DDL

Este es el primer tutorial para usar Sqlite en su versión 3 que es la versión que uso,yo tengo instalada la versión 3.7.17 , no la instale directamente pero se debe haber instalado como dependencia con algún conjunto de herramientas que instale en sistema,por lo que lo mas seguro es que no necesiten instalar en su sistema o lo que es lo mismo ya la deben tener instalada.

Antes que nada este tutorial o serie de tutoriales va dedicado solamente a sistemas Linux de escritorio,no BSD,no Windows,no iOS, no Android,etc.Ya que estos tutoriales los vamos a realizar desde la misma shell de SQlite o sea desde la interfaz que nos ofrece la terminal de nuestro sistema Linux.

Bien el titulo de la entrada parece un poco raro ya que no acostumbro a hacer referencia a las introducciones de temas que hago,pero vamos a explicarlo un poco.porque en este caso es necesario:

SQL es un lenguaje de consulta mas en especifico un lenguaje de consulta estructurados ahora en ingles :

Structured Query Language

Los SQL se usan para hacer consultas a bases de datos,en este caso SQlite3 es nuestro consultor y aunque vamos a usar un nivel intermedio para comunicarnos con las bases de datos y no me refiero al nivel de dificultad,bueno un poco ya que por ejemplo hasta un usuario de una Pc que no sepa nada de programación o de nada,solo que entre a un navegador web y busque algo en google,por ejemplo ya esta manipulando una base de datos,pero a un nivel muy alto,de usuario final,en este caso nosotros usaremos un nivel intermedio gracias a SQL,en este caso SQLite.

El DML es llamado así por la abreviación de Lenguaje de Manipulación de Datos,ahora en ingles:

Data Manipulation Language 

Los comandos(en rojo) se usan para lo siguiente(morado):


SELECT Consulta registros

INSERT Inserta datos en una sola operación.

DELETE Borra(modifica) los datos especificados de un registro.

UPDATE Actualiza(modifica) los datos especificados de un registro.


Esto se usa para  manipular datos en una base de datos de modelo relacional ,lo que es SQLite.

DML es llamado así por la abreviación de Lenguaje de Definicion de Datos,en ingles:

Data definition language

Los comandos(en rojo) se usan para lo siguiente(morado):

CREATE  Crea nuevas tablas e índices
DROP Elimina tablas e índices
ALTER Modifica las tablas agregando columnas o modificando su valor.

Bien no me gusta mucho meterme en esa parte pero bueno,primero que nada vamos a abrir una terminal y vamos a crear un archivo db llamado hola.db:

sqlite3 hola.db

Si no encuentras sqlite3 deben instalarlo según su distribución,pero lo mas seguro es que ya lo tengan.

En este caso crea un base de datos hola.db si ya existe la abre si no existe la crea.

Los comentarios en SQLite son similares a los de Lua para una sola linea,deben comenzar con dos guion medio:

-- Un comentario

Y para los de varias lineas se parecen a los de PHP:


/*
 Un comentario de varias lineas
 De varias lineas :D
*/;

Los  comandos básicos que podemos usar son:

.help -- Muestra ayuda

.version -- Muestra la versión

.databases -- Muestra las bases de datos

..exit -- Sale

.quit -- Sale

.tables -- Muestra las tablas

.read script(lineas de ordenes SQL) -- Ejecuta scripts en .sqlite

.prompt estilo->PS1 estilo->PS2 -- Cambia el estilo de la prompt



Estos son los tipos de datos que podemos implementar en SQLite3:

NULL Valor nulo.

INTEGER Numero entero almacenado en  1, 2, 3, 4, 6 bytes.

REAL Valor de punto flotante, guardado en 8-byte como numero de coma flotante.

TEXT Texto.

BLOB Dato no especificado(Binario) que se guarda como entra.

De momento eso es todo en las siguientes partes veremos ejemplos del uso de DLL y DML.

Leer más...

sábado, 12 de octubre de 2013

Tutorial SQlite3 con Python3 en Linux

SQLite es una herramienta que nos permite guardar bases de datos portables para poder usarlas en programas,scripts,etc sin tener que acceder a conexiones de Bases de Datos establecidas en un servidor especifico,en otras palabras(mis palabras) SQLite es como un MySQL portable, SQLite usa una variante no estándar del lenguaje SQL,por lo cual si conoces el lenguaje SQL como con MySQL,no sera dificil comprender el funcionamiento de SQLite.

Primero que nada debemos tener instalado el modulo para Python,en Linux no debe haber problema,he oído que en otros sistemas si,pero en GNU/Linux no,pero de todos modos comprobamos:

python -c 'import sqlite3'

Si no ven ningún error no hay problema,si ven alguno tendrán que instalar,por ejemplo con pip:

pip install sqlite3

Bueno,primero que nada vamos a abrir nuestro editor de texto favorito para comenzar con los ejemplos,pueden usar la consola de python,pero yo recomiendo un editor y la shell de bash(la termina):

O sea dos terminales:



En mi caso vim(desde aquí se puede ejecutar el código sin usar otra terminal,pero yo uso dos).

Primero que nada vamos a crear un archivo .db,si no existe lo crea si no se conecta a el.

Vamos a crear una variable objeto para conectarnos al archivo  que guardara la base de datos:

db = sqlite3.connect('hola.db')

En estos momentos ya creamos un objeto para manipular la base de datos hola.db,ahora lo que tenemos que crear es un cursor para movernos(por así decirlo) dentro de la db,osea ejecutar comandos de lenguaje SQL en la DB:

cur = db.cursor()

Ahora vamos a ejecutar algunos comandos básicos de SQL con la función execute(este tutorial supone que tienes conocimientos básicos de lenguaje SQL):

cur.execute('CREATE TABLE holamundo(pal1 text,pal2 text)')

cur.execute('INSERT INTO holamundo VALUES("Hola","Mundo")')

Con eso ya tendriamos creada una DB basica,ahora vamos a guardar lo que hicimos con la funcion commit de la db:

db.commit()
Siempre debemos ejecutar commit o no guardara los cambios.

Por ultimo vamos a ejecutar la funcion close para que cierre la conexion:

db.close()

Podemos ejecutar nuestro script,asi quedaria:

 #!/usr/bin/env python3  
 import sqlite3  
 db = sqlite3.connect('hola.db')  
 cur = db.cursor()  
 cur.execute('CREATE TABLE holamundo(pal1 text,pal2 text)')  
 cur.execute('INSERT INTO holamundo VALUES("Hola","Mundo")')  
 db.commit()  
 db.close()  

Y listo tenemos una base de datos portable,si no me creen pueden ejecutar la shell de sqlite3 de linux:

sqlite3 hola.db

.tables

SELECT * FROM hola


Bien funciona :D.

Las ordenes que dimos con exec,las podemos dar en una sola linea ejecutando un script interno,con la función executescript del cursor:

Primero vamos a usar comillas triples,que son para varios comentarios,como DATA<< en Perl,Ruby o como --[[ ]]-- en lua:

cur.executescript("""
    CREATE TABLE holamundo(pal1 text,pal2 text);
    INSERT INTO holamundo VALUES("Hola","Mundo");
    INSERT INTO holamundo VALUES("Hola","desde SQLite Python");
""")

Añadí un comando mas para ver como funciona,en este caso no necesitamos hacer un commit ya que agrega y hace un commit internamente en cada orden.

Ya vimos como agregar ahora como obtener:

Para obtener los datos que necesitamos hay varias maneras,primero la mas sencilla,pero menos potente llamar un único valor:

Como se ve arriba el comando execute usa comandos SQL,si usamos comandos de creación crea,pero si usamos comandos de recuperación donde quedan?

Quedan en variables especiales que se convierten en tuplas,en este caso la función fetchone devuelve una tupla del primer valor que coincida:

cur.execute("SELECT * FROM holamundo")
print (cur.fetchone())

Eso nos devuelve una tupla desde una funcion,por lo cual es valido hacer esto:

print (cur.fetchone()[0])

Bien,pero si queremos todo?

Es fácil saberlo (sabiendo ingles básico),con el comando fetchall:

La cual nos devuelve una tupla de dos dimensiones(en este caso),ya que la primera dimensión contiene las dos tuplas que creamos,y la segunda dimensión contiene los valores de cada tupla:

print (cur.fetchall())

Por lo cual es valido hacer esto:

print (cur.fetchall()[1][1])

En este caso nos devuelve esto:



Bien,hay otra forma de recuperación de datos la cual es iterando sobre una orden de ejecución,ya que como nos devuelve una tupla podemos iterar sobre ella:

for tup in cur.execute("SELECT * FROM holamundo"): # Iteramos en la primera dimencion
    for val in tup: # Iteramos en la segunda dimencion
        print (val)
     
Bien vamos a temas mas avanzados de agregación de datos.

Supongamos que queremos poner un dato en la query que ejecuta la API de SQLite,en otras palabras queremos definir los valores que introduciremos en la tabla desde una variable,como le hacemos,¿Podemos usar formateo de cadenas?,Si,por ejemplo:

Borren la DB que creamos desde la shell:


rm hola.db

 #!/usr/bin/env python3  
 import sqlite3  
 db = sqlite3.connect('hola.db')  
 cur = db.cursor()  
 #cur.execute('CREATE TABLE holamundo(pal1 text,pal2 text)')  
 cur.execute("SELECT * FROM holamundo")  
 x,y = "Hola","Mundo" # Creamos variables  
 cur.execute('INSERT INTO holamundo VALUES ("%s","%s")' %(x,y)) # Formateamos  
 db.commit()  
 db.close()  

Eso se puede hacer,pero no se debe hacer,porque?

Por la vulnerabilidad de formateo de strings,por ejemplo una Inyección SQL.

Entonces que hacemos?

Podemos hacerlo de dos maneras creamos un dato tipo diccionario para que la query parse el valor desde los valores de un diccionario que es clave/valor o usando una tupla que no se puede cambiar el valor:

Primer ejemplo, metodo qmark:

cur.execute('INSER INTO holamundo VALUES(?,?)',(x,y))

En este caso usamos un estilo de formateo,pero con el símbolo (?) y le pasamos el valor desde una tupla,la cual no se puede modificar.

Segundo ejemplo, metodo de nombre:

cur.execute('SELECT * FROM holamundo WHERE pal1=:hola',{"hola":"Hola"});

print(cur.fetchall())

Este se ve un poco mas complejo pero es fácil,solo hay que pesarle los valores de un diccionario y como es una string para que no de error de valor debemos anteponer dos puntos en la query SQL,veamos otro ejemplo:

x,y = "Hola", "Mundo" # X vale Hola,Y vale Mundo

dic = {'x':x,'y':y} # Adentro del diccionario X vale X que a la vez vale Hola,Y vale Y que a la vez vale Mundo

cur.execute("INSERT INTO holamundo VALUES(:x,:y)",dic) # Insertamos los valores del diccionario,anteponemos dos puntos para que se reconozca como string.

Ahora como podemos ver las columnas?,ya que podemos ver los valores que contienen pero las columnas?

Aquí falta ver que columnas son las que contienen Hola y Mundo que serian pal1 y pal2,para ello vamos a cambiar el atributo row_factory de la db a sqlite3.Row:

db.row_factory = sqlite3.Row

cur = db.cursor()

cur.execute("SELECT * FROM holamundo")

Ahora podemos acceder a las llaves de la tupla que se crea cuando buscamos algo,recuerdan fetchone:

for i in cur.fetchone().keys():
    print(i)
 
También compatible con len:

print(len(cur.fetchone().keys()))

De esa manera tendremos las columnas de la tabla ya que por defecto fetch nos devuelve una tupla sqlite,y de esta manera nos devuelve una columna sqlite compatible con las funciones keys,len,entre otra.

De hecho la funcion sqlite3.Row es opcional,podemos programar nuestra propia funcion para que sea igual al parametro de row_factory de la DB,es un poco largo de explicar pero veamos un poco:

Creamos una funcion que sea igual a row:_factory,este parametro nos pasa argumentos,asi que vamos a recorrerlos con,con *args(recuerdan el tutorial):

 #!/usr/bin/env python3  
 import sqlite3  
 def datos(*args):  
   for i in args:  
     print (i)  
 db = sqlite3.connect('hola.db')  
 db.row_factory = datos  
 cur = db.cursor()
 cur.execute("select * from holamundo")
 print(cur.fetchone())
 db.close()  

Eso nos dirá los argumentos que nos manda,los cuales son:

El primero es un objeto mas específicamente un cursor,el segundo es la columna que regresa la query que ejecutamos y nos manda un tercero Nulo(None):

Así que podemos hacer esto,para ver las funciones que tienen:

 for i in dir(args[0]):
        print i

for i in dir(args[1]):
        print i

Y nos muestra las funciones de cada uno,en la pagina oficial nos muestra una manera de crear un diccionario,en este ejemplo seria así:

 import sqlite3  
   
 def dict_factory(cursor, row):  
   d = {}  
   for idx, col in enumerate(cursor.description):  
     d[col[0]] = row[idx]  
   return d  
   
 con = sqlite3.connect("hola.db")  
 con.row_factory = dict_factory  
 cur = con.cursor()  
 cur.execute("select * from holamundo")  
   
 print (type(cur.fetchone()))  
   
 for k in cur.fetchone():  
   print (k,"->",cur.fetchone()[k])
   

Todo lo que hicimos lo podemos hacer conectandonos directamente a la memoria ram,el cual nos dara un espacio de trabajo temporal,no lo recomiendo a menos de que sea un trabajo especial como un manejo de memoria basada en un algoritmo temporal,osea como una actualización basada en datos actuales que pueden cambiar,normalmente podemos hacer todo el trabajo en archivos,como en este tutorial en la base hola.db,de todas formas podemos conectarnos a una base de datos creada directamente en la memoria RAM la base de datos se destruirá cuando se cierre la conexión:

Para hacerlo necesitamos usar el parámetro :memory: en la conexión:

  #!/usr/bin/env python3   
  import sqlite3   
  db = sqlite3.connect(':memory:')   
  cur = db.cursor()   
  cur.execute('CREATE TABLE holamundo(pal1 text,pal2 text)')   
  cur.execute('INSERT INTO holamundo VALUES("Hola","Mundo")')  
  cur.execute('SELECT * from holamundo')  
  print(cur.fetchall())   
  db.commit()   
  db.close()  
   

Bien con eso terminamos este tutorial,tal vez haga otra parte ya que falto lo mas avanzado que es crear funciones y clases para usarlas como extensión,pero de momento es todo.

Esto es muy útil cuando se programan juegos,por ejemplo con pygame,o para android,un ejemplo rápido es ponerle un historial de juegos ganados al juego de ahorcado que programe en perl,así es usar Python junto con Perl es sencillo usar lenguajes juntos,así que vamos a ver como quedaría el script y haber si le entienden o encuentran errores con lo que aprendimos en este tutorial:

 #!/usr/bin/ev python3  
   
 from sys import argv  
   
 import sqlite3  
   
 db = sqlite3.connect('records.db')  
 db.row_factory = sqlite3.Row  
 cur = db.cursor()  
 num = 0  
   
 query = "SELECT * FROM ahorcado order by puntuaje"  
   
 try:  
   cur.execute(query)  
 except:  
   cur.execute('CREATE TABLE ahorcado(nombre TEXT,puntuaje INTEGER)')  
   
 def mayor_pal(p):  
   global num  
   if len(p) > num:  
     num = len(p)  
   
 def agregar(x,y):  
   gamer = x  
   puntos = y  
   cur.execute("INSERT INTO ahorcado VALUES(:jugador,:puntuaje)",{"jugador":gamer,"puntuaje":puntos})  
   db.commit()  
   
 def ver(x):  
   for i in x.execute(query):  
     mayor_pal(i[0])   
   print "\tJugador",(" "*num),"Puntuaje\n"  
   for i in x.execute(query):  
     print "\t",i[0],(" "*(num+4)),i[1]  
   
 if len(argv) > 1:  
   if argv[1] == "-a" and len(argv) == 4:  
     agregar(argv[2],argv[3])  
   elif argv[1] == "-v":  
     ver(cur)  
   else:  
     exit()  
   
 db.close()  

Al juego de ahorcado le hice también unas pequeñas modificaciones.

Pueden descargarlo aquí:

Enlace

Esto lo he aprendido de la documentación oficial como siempre,así que pueden darle una leeida para que aprendan de la misma fuente que yo:

http://docs.python.org/2/library/sqlite3.html
Leer más...