Categorías
Python

Hermosa sopa: Construir un Web Rascador con Python

 

Tabla de Contenidos

  • los problemas que Migraciones SolveMaking Cambios base de datos sin SQLAvoiding RepetitionEnsuring Modelo definiciones y la base de datos de esquema de base de datos SyncTracking Cambiar el esquema de control de versiones
  • Haciendo Cambios base de datos sin SQL
  • evitando la repetición
  • Asegurar Modelo definiciones y la Base de Datos esquema en la base de datos de sincronización
  • Seguimiento esquema de Cambio en la versión de control
  • Configuración de una Django Proyecto
  • Creación de Migraciones
  • la aplicación de las migraciones
  • cambiar los modelos
  • Listado de salida migraciones
  • Unapplying migraciones
  • de nomenclatura migraciones
  • Conclusión
  • vídeo
  • Realización de cambios de base de datos SQL sin
  • evitando la repetición
  • Asegurar Modelo definiciones y la base de datos de esquema en la base de datos de sincronización
  • Seguimiento esquema Cambio de control Versión

Watc h Ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del Real Python. Mira que junto con el tutorial escrito para profundizar su comprensión: Django migraciones 101

Desde la versión 1.7, Django ha llegado con una función de apoyo a las migraciones de bases de datos. En Django, las migraciones de bases de datos por lo general van de la mano con los modelos: cada vez que codificar un nuevo modelo, que también generan una migración para crear la tabla en la base de datos necesaria. Sin embargo, las migraciones pueden hacer mucho más.

Usted va a aprender Django migraciones de trabajo y cómo se puede obtener el máximo provecho de ellos a lo largo de cuatro artículos y un vídeo:

  • Parte 1: Django Migraciones: A Primer (artículo actual)
  • Parte 2 : Profundizando en las migraciones
  • Parte 3: datos migraciones
  • vídeo: Django 1.7 migraciones – imprimación

en este artículo, usted se sienta cómodo con las migraciones de Django y aprender lo siguiente:

  • Cómo crear tablas de base de datos sin escribir ningún
  • SQL Cómo modificar automáticamente su base de datos después de cambiar sus modelos
  • cómo revertir los cambios realizados en la base de datos de bonificación

gratuito: Haga clic aquí para obtener acceso a una Guía de Recursos libre de Django aprendizaje (PDF) que aparecen consejos y trucos, así como los errores comunes a evitar al crear aplicaciones web Python + Django.

los problemas que las migraciones Resuelva

Si usted es nuevo en Django o desarrollo web en general, es posible que no esté familiarizado con el concepto de las migraciones de bases de datos, y es posible que no parecer obvio por qué son una buena idea.

En primer lugar, vamos a definir rápidamente un par de términos para asegurarse de que todo el mundo está en la misma página. Django está diseñado para trabajar con una relationaldatabase, almacenada en un sistema de gestión de base de datos relacional como PostgreSQL, MySQL o SQLite.

En una base de datos relacional, los datos se organizan en tablas. Una tabla de base de datos tiene un cierto número de columnas, pero puede tener cualquier número de filas. Cada columna tiene un tipo de datos específico, como una cadena de una cierta longitud máxima o un número entero positivo. La descripción de todas las tablas con sus columnas y sus respectivos tipos de datos se llama un esquema de base de datos. Los sistemas de bases de datos

todo ello apoyado por Django usan el lenguaje SQL para crear, leer, actualizar y borrar datos en una base de datos relacional. SQL también se usa para crear, modificar y eliminar las tablas de base mismos.

Trabajo directamente con SQL puede ser bastante engorroso, por lo que para hacer su vida más fácil, Django viene con un mapeador objeto-relacional, o ORM para abreviar. El ORM mapea la base de datos relacional con el mundo de la programación orientada a objetos. En lugar de definir las tablas de bases de datos en SQL, se escribe modelos de Django en Python. Sus modelos definen campos de la base, que corresponden a las columnas en las tablas de bases de datos.

Aquí está un ejemplo de cómo una clase de modelo de Django se asigna a una tabla de base de datos:

Pero sólo la definición de una clase de modelo en un archivo de Python no hacer una tabla de base de datos aparece mágicamente de la nada. Creación de las tablas de base de datos para almacenar los modelos de Django es el trabajo de una migración de base de datos. Además, cada vez que se realiza un cambio en sus modelos, como la adición de un campo, la base de datos tiene que ser cambiado también. Migraciones manejar eso también.

Aquí hay algunas maneras migraciones Django hacen la vida más fácil.

Haciendo Cambios base de datos sin SQL

Sin migraciones, que tendría que conectarse a su base de datos y el tipo en un montón de comandos SQL o utilizar una herramienta gráfica como phpMyAdmin a modificar el esquema de base de datos cada vez que quería cambiar la definición del modelo.

En Django, las migraciones están escritas principalmente en Python, por lo que no tiene que saber cualquier SQL a menos que tenga casos de uso muy avanzadas.

evitando la repetición

La creación de un modelo y luego escribir SQL para crear las tablas de la base de que sería repetitivo.

migraciones se generan a partir de modelos, asegurándose de que no repita a sí mismo.

Asegurar Modelo definiciones y la base de datos de esquema de sincronización

Por lo general, tiene varias instancias de su base de datos, por ejemplo, una base de datos para cada desarrollador en su equipo, una base de datos para probar y una base de datos con datos en tiempo real.

Sin migraciones, que tendrá que realizar ningún cambio de esquema en cada uno de su base de datos, y usted tendrá que llevar un registro que ya se han hecho cambios a los que la base de datos.

con Django migraciones, se puede mantener fácilmente múltiples bases de datos en sincronía con sus modelos. Base de Datos de Seguimiento

esquema Cambio en el sistema de control de versiones de control de versiones

A, como Git es excelente para el código, pero no tanto para los esquemas de bases de datos.

las migraciones son evidentes en Python Django, puede ponerlos en un sistema de control de versiones al igual que cualquier otra pieza de código.

Por ahora, estás con suerte convencido de que las migraciones son una herramienta útil y potente. Vamos a empezar a aprender cómo liberar ese poder.

Configuración de un proyecto Django

A lo largo de este tutorial, vamos a trabajar en una simple aplicación de seguimiento de Bitcoin como un proyecto de ejemplo.

El primer paso es instalar Django. Aquí es cómo se hace eso en Linux o MacOS X utilizando un entorno virtual:

$ python3 -m venv env
$ source env/bin/activate
(env) $ pip install "Django==2.1.*"
...
Successfully installed Django-2.1.3

Ahora se ha creado un nuevo entorno virtual y activado, así como Django instalado en ese entorno virtual.

Tenga en cuenta que en Windows, debe ejecutar env / bin / activate.bat lugar de origen env / bin / activar para activar su entorno virtual.

Para facilitar la legibilidad, los ejemplos de la consola no incluirá el (env) parte de la pronta a partir de ahora.

Con Django instalado, puede crear el proyecto mediante los siguientes comandos:

$ django-admin.py startproject bitcoin_tracker
$ cd bitcoin_tracker
$ python manage.py startapp historical_data

Esto le da un proyecto simple y una aplicación llamada historical_data. Ahora debería tener esta estructura de directorios:

bitcoin_tracker/
|
├── bitcoin_tracker/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
|
├── historical_data/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations/
│ │ └── __init__.py
| |
│ ├── models.py
│ ├── tests.py
│ └── views.py
|
└── manage.py

Dentro del directorio bitcoin_tracker, hay dos subdirectorios: bitcoin_tracker para los archivos de todo el proyecto y historical_data que contienen los archivos de la aplicación que ha creado.

Ahora, para crear un modelo, añadir esta clase en historical_data / models.py:

class PriceHistory(models.Model):
date = models.DateTimeField(auto_now_add=True)
price = models.DecimalField(max_digits=7, decimal_places=2)
volume = models.PositiveIntegerField()

Este es el modelo básico para realizar un seguimiento de los precios de Bitcoin.

Además, no se olvide de agregar la aplicación recién creada a settings.INSTALLED_APPS. Abrir bitcoin_tracker / settings.py y añadir a la lista historical_data INSTALLED_APPS, así:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'historical_data',
]

Las otras configuraciones son muy bien para este proyecto. Este tutorial asume que su proyecto está configurado para utilizar una base de datos SQLite, que es el valor predeterminado.

Creación de Migraciones

Con el modelo creado, lo primero que hay que hacer es crear una migración por ello. Usted puede hacer esto con el siguiente comando:

$ python manage.py makemigrations historical_data
Migrations for 'historical_data':
historical_data/migrations/0001_initial.py
- Create model PriceHistory

Nota: especificando el nombre de la aplicación, historical_data, es opcional. De no utilizarla crea migraciones para todas las aplicaciones.

Esto crea el archivo de migraciones que instruye Django sobre cómo crear las tablas de base de datos para los modelos definidos en su aplicación. Vamos a echar otro vistazo a la estructura de directorios:

bitcoin_tracker/
|
├── bitcoin_tracker/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
|
├── historical_data/
│ ├── migrations/
│ │ ├── 0001_initial.py
│ │ └── __init__.py
| |
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
|
├── db.sqlite3
└── manage.py

Como se puede ver, el directorio de migraciones contiene ahora un nuevo archivo: 0001_initial.py.

Nota: Usted puede notar que la ejecución de las makemigrations también creó el Comando db.sqlite3 archivo, que contiene la base de datos SQLite.

Cuando se intenta acceder a un archivo de base de datos SQLite3 no existente, se creará automáticamente.

Este comportamiento es única para SQLite3. Si utiliza cualquier otra base de datos back-end como PostgreSQL o MySQL, usted tiene que crear la base de datos a sí mismo antes de corriendo makemigrations.

Puede echar un vistazo a la base de datos con el comando de gestión dbshell. En SQLite, el comando para listar todas las tablas es simplemente .tables:

$ python manage.py dbshell
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> .tables
sqlite>

La base de datos todavía está vacía. Eso va a cambiar cuando se aplica la migración. Tipo .Quit para salir de la cáscara de SQLite.

La aplicación de las migraciones

Ahora ha creado la migración, pero para realmente hacer cualquier cambio en la base de datos, tiene que aplicar con el comando migrate gestión:

$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, historical_data, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying historical_data.0001_initial... OK
Applying sessions.0001_initial... OK

Hay mucho que hacer aquí! De acuerdo con la salida, la migración se ha aplicado con éxito. Pero ¿de dónde todas las otras migraciones vienen?

Recuerde que el establecimiento de INSTALLED_APPS? Algunas de las otras aplicaciones que figuran allí también vienen con las migraciones, y el comando de gestión de migración aplica las migraciones para todas las aplicaciones instaladas por defecto.

echar otro vistazo a la base de datos:

$ python manage.py dbshell
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> .tables
auth_group django_admin_log
auth_group_permissions django_content_type
auth_permission django_migrations
auth_user django_session
auth_user_groups historical_data_pricehistory
auth_user_user_permissions
sqlite>

Ahora hay varias tablas. Sus nombres se dan una idea de su propósito. La migración que ha generado en el paso anterior ha creado la tabla historical_data_pricehistory. Vamos a inspeccionar mediante el comando .schema:

sqlite> .schema --indent historical_data_pricehistory
CREATE TABLE IF NOT EXISTS "historical_data_pricehistory"(
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"date" datetime NOT NULL,
"price" decimal NOT NULL,
"volume" integer unsigned NOT NULL
);

El comando imprime .schema a cabo la declaración de que tienes que ejecutar para crear la tabla a crear. El parámetro de formatos –indent muy bien. Incluso si usted no está familiarizado con la sintaxis SQL, se puede ver que el esquema de la tabla historical_data_pricehistory refleja los campos del modelo PriceHistory.

Hay una columna para cada campo y un identificador de columna adicional para la clave primaria, que Django crea automáticamente a menos que se especifique explícitamente una clave principal en su modelo.

Esto es lo que sucede si se ejecuta el comando migrate nuevo:

$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, historical_data, sessions
Running migrations:
No migrations to apply.

Nada! Django, que recuerda las migraciones ya se han aplicado y no intenta volver a ejecutar ellos.

Vale la pena señalar que también puede limitar el comando de gestión de la migración a una sola aplicación:

$ python manage.py migrate historical_data
Operations to perform:
Apply all migrations: historical_data
Running migrations:
No migrations to apply.

Como se puede ver, Django ahora sólo se aplica migraciones para la aplicación historical_data.

Cuando se ejecutan las migraciones, por primera vez, es una buena idea para aplicar todas las migraciones para asegurar su base de datos contiene las tablas necesarias para las funciones que puede dar por hechas, como la autenticación de usuarios y sesiones.

cambiar los modelos

Sus modelos no están escritas en piedra. Sus modelos cambiarán a medida que su proyecto Django gana más características. Es posible agregar o quitar campos o cambiar sus tipos y opciones.

Cuando se cambia la definición de un modelo, las tablas de la base que se utilizan para almacenar estos modelos tienen que ser cambiado también. Si sus definiciones de modelos no coinciden con el esquema de base de datos actual, lo más probable es correr en una django.db.utils.OperationalError.

Así que, ¿cómo cambiar las tablas de la base? Mediante la creación y aplicación de una migración.

Mientras se probaba que su control de Bitcoin, se da cuenta de que ha cometido un error. La gente está vendiendo fracciones de Bitcoin, por lo que el volumen de campo debe ser de tipo DecimalField en lugar de PositiveIntegerField. el cambio de

Let el modelo a tener este aspecto:

class PriceHistory(models.Model):
date = models.DateTimeField(auto_now_add=True)
price = models.DecimalField(max_digits=7, decimal_places=2)
volume = models.DecimalField(max_digits=7, decimal_places=3)

Sin migraciones, que tendría que averiguar la sintaxis SQL para convertir una PositiveIntegerField en un DecimalField. Por suerte, Django manejar eso para usted. Sólo decirle a la realización de migraciones:

$ python manage.py makemigrations
Migrations for 'historical_data':
historical_data/migrations/0002_auto_20181112_1950.py
- Alter field volume on pricehistory

Nota: El nombre del archivo de migración (0002_auto_20181112_1950.py) se basa en la hora actual y será diferente si lo sigue en su sistema.

Ahora se aplica esta migración de su base de datos:

$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, historical_data, sessions
Running migrations:
Applying historical_data.0002_auto_20181112_1950... OK

La migración ha sido aplicado con éxito, por lo que puede utilizar dbshell para verificar que los cambios tuvieron un efecto:

$ python manage.py dbshell
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> .schema --indent historical_data_pricehistory
CREATE TABLE IF NOT EXISTS "historical_data_pricehistory" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"date" datetime NOT NULL,
"price" decimal NOT NULL,
"volume" decimal NOT NULL
);

Si se compara el nuevo esquema con el esquema que vimos antes , se dará cuenta de que el tipo de la columna de volumen ha cambiado de número entero a decimal para reflejar el cambio del campo de volumen en el modelo de PositiveIntegerField a DecimalField.

Listado Out migraciones

Si usted quiere saber lo que existen las migraciones en un proyecto de Django, que no tienen que cavar a través de las migraciones directorios de aplicaciones instaladas. Se pueden utilizar los showmigrations comando:

$ ./manage.py showmigrations
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
[X] 0003_logentry_add_action_flag_choices
auth
[X] 0001_initial
[X] 0002_alter_permission_name_max_length
[X] 0003_alter_user_email_max_length
[X] 0004_alter_user_username_opts
[X] 0005_alter_user_last_login_null
[X] 0006_require_contenttypes_0002
[X] 0007_alter_validators_add_error_messages
[X] 0008_alter_user_username_max_length
[X] 0009_alter_user_last_name_max_length
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
historical_data
[X] 0001_initial
[X] 0002_auto_20181112_1950
sessions
[X] 0001_initial

Esta lista de todas las aplicaciones en el proyecto y las migraciones asociadas a cada aplicación. Además, se pondrá una gran X al lado de las migraciones que ya se han aplicado.

Para nuestro pequeño ejemplo, el comando showmigrations no es particularmente emocionante, pero es muy útil cuando se empieza a trabajar en una base de código existente o trabajar en un equipo en el que no es la única persona añadiendo migraciones.

Unapplying migraciones

Ahora usted sabe cómo hacer cambios en su esquema de base mediante la creación y aplicación de las migraciones. En algún momento, es posible que desee deshacer los cambios y volver cambio a un esquema de base anterior porque:

  • desea probar una migración a un colega escribió
  • cuenta de que un cambio realizado fue una mala idea
  • trabajar en múltiples funciones con diferentes cambios de bases de datos en paralelo
  • desea restaurar una copia de seguridad que se creó la base de datos cuando todavía tenía un esquema mayor

Por suerte, las migraciones no tienen que ser una calle de sentido único. En muchos casos, los efectos de la migración se puede deshacer unapplying una migración. Para cancelar la aplicación de una migración, tiene que llamar a migrar con el nombre de la aplicación y el nombre de la migración antes de la migración desea cancelar la aplicación.

Si desea revertir la migración 0002_auto_20181112_1950 en su aplicación historical_data, usted tiene que pasar 0001_initial como un argumento para el comando migrate:

$ python manage.py migrate historical_data 0001_initial
Operations to perform:
Target specific migration: 0001_initial, from historical_data
Running migrations:
Rendering model states... DONE
Unapplying historical_data.0002_auto_20181112_1950... OK

La migración ha sido no aplicado, lo que significa que los cambios en la base de datos se han invertido.

Unapplying una migración no elimina su archivo de migración. La próxima vez que ejecute el comando migrate, la migración se aplicará de nuevo.

Precaución: Do migraciones no confundir unapplying con la operación de deshacer estás acostumbrado a partir de su editor de texto favorito.

No todas las operaciones de base de datos puede ser completamente revertido. Si elimina un campo de un modelo, crea una migración, y aplicarlo, Django quitar la columna respectiva de la base de datos.

Unapplying que la migración se volverá a crear la columna, pero no va a traer de vuelta los datos que se almacenan en esa columna!

Cuando usted está tratando con los nombres de migración, Django le ahorra un par de pulsaciones de teclas al no forzar a deletrear el nombre completo de la migración. Se necesita suficiente simplemente del nombre para identificarlo de forma inequívoca.

En el ejemplo anterior, habría sido suficiente para ejecutar python manage.py migran historical_data 0001.

Naming migraciones

En el ejemplo anterior, Django le ocurrió un nombre para la migración basado en la marca de tiempo, algo así como * 0002_auto_20181112_1950. Si no estás contento con eso, entonces usted puede utilizar el parámetro –name para proporcionar un nombre personalizado (sin la extensión .py).

Para probar eso, primero hay que quitar la vieja migración. Usted ya no aplicado, así que puede eliminar el archivo:

$ rm historical_data/migrations/0002_auto_20181112_1950.py

ya se puede volver a crearlo con un nombre más descriptivo:

$ ./manage.py makemigrations historical_data --name switch_to_decimals

Esto creará la misma migración como antes, excepto con el nuevo nombre de 0002_switch_to_decimals.

Conclusión

Cubriste un poco de terreno en este tutorial y aprendió los fundamentos de las migraciones de Django.

En resumen, los pasos básicos para utilizar las migraciones Django este aspecto:

eso es todo! Este flujo de trabajo trabajará la mayoría de las veces, pero si las cosas no salen como se esperaba, también saber cómo cancelar la aplicación lista y migraciones.

Si previamente creados y modificados sus tablas de bases de datos con SQL escrito a mano, ahora se han vuelto mucho más eficiente al delegar este trabajo a las migraciones de Django.

En el siguiente tutorial de esta serie, que será profundizar en el tema y aprender cómo el trabajo de Django migraciones bajo el capó. Bono

gratuito: Haga clic aquí para obtener acceso a una guía gratuita Django Recursos de Aprendizaje (PDF) que le muestra sugerencias y trucos, así como los errores comunes a evitar al crear aplicaciones web Python + Django.

Salud!

vídeo

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del Real Python. Mira que junto con el tutorial escrito para profundizar su comprensión: Django migraciones 101

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *