Diferencia entre revisiones de «Usuario:Lmorillas/intropyaytozgz/bbdd»
De WikiEducator
(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}} | ||
− | + | ||
− | + | {{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 | ||
}} | }} | ||
− | + | == 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 == | |
* 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 == | |
* 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 == | |
* 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 == | |
* 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 == | |
* 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 == | |
<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 == | |
<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 == | |
− | [[ | + | [[Curso_Python_DGA_2011/acceso_a_datos/MySQL_python| Acceso a MySQL con Python]] |
Última revisión de 01:11 4 dic 2012
Contenido
Conocimiento previo
|
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