Diferencia entre revisiones de «Usuario:Lmorillas/intropyaytozgz/bbdd»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con '{{MiTitulo|Bases de datos relacionales}} == Bases de Datos Relacionales == <br /> {{Conocimiento previo| * Una base de datos relacional es una colección de tablas, cada una ti…')
 
 
(4 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{MiTitulo|Bases de datos relacionales}}
 
{{MiTitulo|Bases de datos relacionales}}
  
== Bases de Datos Relacionales ==
+
 
<br />
+
{{Conocimiento previo|TOCdepth=2|
{{Conocimiento previo|
+
 
* Una base de datos relacional es una colección de tablas, cada una tien un número fijo de columnas y un número variable de filas. Las columnas tienen un nombre y contienen datos del mismo tipo.
 
* Una base de datos relacional es una colección de tablas, cada una tien un número fijo de columnas y un número variable de filas. Las columnas tienen un nombre y contienen datos del mismo tipo.
 
* Muchos sistemas de bases de datos: comerciales (Oracle, DB2, SQL Server, ...) y libres (MySQL, PostgreSQL, SQLite ...)
 
* Muchos sistemas de bases de datos: comerciales (Oracle, DB2, SQL Server, ...) y libres (MySQL, PostgreSQL, SQLite ...)
 
* SQLite está incluida en Python
 
* SQLite está incluida en Python
 +
* Estándar para acceder a bases de datos: DB API 2.0 http://www.python.org/dev/peps/pep-0249
 
}}
 
}}
  
Usar bases de datos relacionales con Python es muy fácil.
+
== Estructura ==
Python proporciona un estándar para acceder a bases de datos. La DB API 2.0 es la versión vigente ([http://www.python.org/dev/peps/pep-0249  PEP 249])
+
Módulos compatibles:
+
* MySQLdb (MySQL)
+
* psycopg2 (PostgreSQL)
+
* cx_Oracle (Oracle)
+
* mxODBC (SQL Server, DB2, Sybase, Oracle, etc.)
+
 
+
=== Estructura ===
+
 
La DB API usa dos conceptos para realizar los procesos:
 
La DB API usa dos conceptos para realizar los procesos:
 
* Objeto Conexión
 
* Objeto Conexión
Línea 26: Línea 18:
 
** Accede a los resultados
 
** Accede a los resultados
  
=== Conexión ===
+
== Conexión ==
 
* El objeto conexión se encarga de conectar con la base de datos
 
* El objeto conexión se encarga de conectar con la base de datos
 
* Proporciona acceso (red/RPC) a la base de datos.
 
* Proporciona acceso (red/RPC) a la base de datos.
Línea 32: Línea 24:
 
* Gestiona las transacciones (grupos lógicos de sentencias)
 
* Gestiona las transacciones (grupos lógicos de sentencias)
  
=== Cursor ===
+
== Cursor ==
 
* Creado a partir de una conexión
 
* Creado a partir de una conexión
 
* Sentencias de manipulación y de consulta en la bbdd.
 
* Sentencias de manipulación y de consulta en la bbdd.
Línea 39: Línea 31:
 
* Método fetch*() que lee los datos del result set
 
* Método fetch*() que lee los datos del result set
  
=== Transacciones ===
+
== Transacciones ==
 
* DB API 2.0 soporta transacciones (si el motor las soporta) desde el objeto conexión.
 
* DB API 2.0 soporta transacciones (si el motor las soporta) desde el objeto conexión.
 
* conexión: commit / rollback
 
* conexión: commit / rollback
  
=== Introspección del esquema ===
+
== Introspección del esquema ==
 
* Busca el tipo de las columnas de una tabla:
 
* Busca el tipo de las columnas de una tabla:
 
** Método sencillo:
 
** Método sencillo:
Línea 56: Línea 48:
 
</source>
 
</source>
  
=== Muy importante: Paso de parámetros ===
+
== Muy importante: Paso de parámetros ==
 
* No hay ue hacer nunca sustitución de cadenas de caracteres para evitar inyección de código.
 
* No hay ue hacer nunca sustitución de cadenas de caracteres para evitar inyección de código.
 
* Hay una variable paramstyle que define cómo se pasan los parámetros.
 
* Hay una variable paramstyle que define cómo se pasan los parámetros.
Línea 66: Línea 58:
 
** 'pyformat': Formato Python, ej. '...WHERE name=%(name)s'
 
** 'pyformat': Formato Python, ej. '...WHERE name=%(name)s'
  
=== Ejemplo con sqlite ===
+
== Ejemplo con sqlite ==
 
<source lang="python">
 
<source lang="python">
 
# Fuente: http://mundogeek.net/archivos/2008/06/25/bases-de-datos-en-python
 
# Fuente: http://mundogeek.net/archivos/2008/06/25/bases-de-datos-en-python
Línea 98: Línea 90:
 
</source>
 
</source>
  
=== Ejemplo mysql ===
+
== Ejemplo mysql ==
 
<source lang="python">
 
<source lang="python">
 
import MySQLdb
 
import MySQLdb
Línea 124: Línea 116:
 
     print firstname, age, city  
 
     print firstname, age, city  
 
</source>
 
</source>
=== Ampliación MySQL ===
+
== Ampliación MySQL ==
[[../MySQL python| Acceso a MySQL con Python]]
+
[[Curso_Python_DGA_2011/acceso_a_datos/MySQL_python| Acceso a MySQL con Python]]

Última revisión de 00:11 4 dic 2012



Conocimiento previo

Icon preknowledge.gif

Conocimiento previo

  • Una base de datos relacional es una colección de tablas, cada una tien un número fijo de columnas y un número variable de filas. Las columnas tienen un nombre y contienen datos del mismo tipo.
  • Muchos sistemas de bases de datos: comerciales (Oracle, DB2, SQL Server, ...) y libres (MySQL, PostgreSQL, SQLite ...)
  • SQLite está incluida en Python
  • Estándar para acceder a bases de datos: DB API 2.0 http://www.python.org/dev/peps/pep-0249



Estructura

La DB API usa dos conceptos para realizar los procesos:

  • Objeto Conexión
    • conexión con la base de datos
    • Transacciones
  • Objeto Cursor
    • Ejecuta las sentencias
    • Accede a los resultados

Conexión

  • El objeto conexión se encarga de conectar con la base de datos
  • Proporciona acceso (red/RPC) a la base de datos.
  • Este objeto no permite lanzar sentencias.
  • Gestiona las transacciones (grupos lógicos de sentencias)

Cursor

  • Creado a partir de una conexión
  • Sentencias de manipulación y de consulta en la bbdd.
  • Método execute(), que acepta una secuencia de parámetros.
  • Almacena los datos del result set depués de lanzar la consulta.
  • Método fetch*() que lee los datos del result set

Transacciones

  • DB API 2.0 soporta transacciones (si el motor las soporta) desde el objeto conexión.
  • conexión: commit / rollback

Introspección del esquema

  • Busca el tipo de las columnas de una tabla:
    • Método sencillo:
cursor.execute(select * from testtable where 1=0)
# mira el atributo cursor.description
    • Método avanzado:
cursor.columns(table='testtable')
rows = cursor.fetchall()

Muy importante: Paso de parámetros

  • No hay ue hacer nunca sustitución de cadenas de caracteres para evitar inyección de código.
  • Hay una variable paramstyle que define cómo se pasan los parámetros.
  • Todos los módulos admiten al menos uno de:
    • 'qmark': Signo de interrogación, ej. '...WHERE name=?'
    • 'numeric': Numerico, posicional, ej. '...WHERE name=:1'
    • 'named': por Nombre, ej. '...WHERE name=:name'
    • 'format': Formato ANSI C, ej. '...WHERE name=%s'
    • 'pyformat': Formato Python, ej. '...WHERE name=%(name)s'

Ejemplo con sqlite

# Fuente: http://mundogeek.net/archivos/2008/06/25/bases-de-datos-en-python
import sqlite3 as dbapi
 
# 1. Creamos objeto conexión
bbdd = dbapi.connect("bbdd.dat")
 
# 2. Creamos un cursor
cursor = bbdd.cursor()
 
# 3. Usamos cursor para acceder a la  base de datos
# 3.1. create
cursor.execute("""create table empleados (dni text,
                  nombre text,
                  departamento text)""")
 
# 3.2. insert
cursor.execute("""insert into empleados
                  values ('12345678-A', 'Manuel Gil', 'Contabilidad')""")
 
bbdd.commit()
 
# 3.3 select
cursor.execute("""select * from empleados
                  where departamento='Contabilidad'""")
 
# extraer resultados de select --> están almacenados en cursor
for tupla in cursor.fetchall():
    print tupla

Ejemplo mysql

import MySQLdb
 
dbusername = "user" 
dbname = 'user_private' 
dbpassword = 'some_password'
 
# connect to the database 
db = MySQLdb.Connect(db = dbname, user = dbusername, passwd = dbpassword)
 
#To perform a query, you first need a cursor, and then you can execute queries on it. 
cursor = db.cursor()
 
# create the query 
query = "SELECT * FROM foo"
 
# execute the query 
cursor.execute(query)
 
# retrieve the result 
results = cursor.fetchall()
 
for firstname, age, city in results: 
    print firstname, age, city

Ampliación MySQL

Acceso a MySQL con Python