Usar Cloud SQL con Python

En esta parte del tutorial de Bookshelf para Phyton, se explica cómo la aplicación de muestra almacena sus datos persistentes en Google Cloud SQL.

Esta página forma parte de un tutorial de varias páginas. Para comenzar desde lo básico y consultar las instrucciones de configuración, ve a la aplicación Bookshelf de Python.

Crear una instancia y base de datos de Cloud SQL

Cuando se despliega, tu aplicación utiliza el proxy de Cloud SQL que está integrado en el entorno de App Engine para comunicarse con tu instancia de Cloud SQL. Sin embargo, para probar tu aplicación localmente, debes instalar y usar una copia local del proxy de Cloud SQL en tu entorno de desarrollo.

Más información sobre el proxy de Cloud SQL.

Para realizar tareas administrativas básicas en tu instancia de Cloud SQL, puedes usar el cliente MySQL.

Instalar el proxy de SQL

Descarga e instala el proxy de Cloud SQL. El proxy de Cloud SQL se usa para conectarse a la instancia de Cloud SQL cuando se ejecuta localmente.

Linux de 64 bits

  1. Descarga el proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. Haz que el proxy sea ejecutable:
    chmod +x cloud_sql_proxy
    

Linux de 32 bits

  1. Descarga el proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. Haz que el proxy sea ejecutable:
    chmod +x cloud_sql_proxy
    

macOS de 64 bits

  1. Descarga el proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. Haz que el proxy sea ejecutable:
    chmod +x cloud_sql_proxy
    

macOS de 32 bits

  1. Descarga el proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. Haz que el proxy sea ejecutable:
    chmod +x cloud_sql_proxy
    

Windows de 64 bits

Haz clic con el botón derecho en https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe y selecciona "Guardar enlace como..." para descargar el proxy. Después, cámbiale el nombre a cloud_sql_proxy.exe.

Windows de 32 bits

Haz clic con el botón derecho en https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe y selecciona "Guardar enlace como..." para descargar el proxy. Después, cámbiale el nombre a cloud_sql_proxy.exe.
Si el sistema operativo no se incluye aquí, también puedes compilar el proxy desde el origen.

Crear una instancia de Cloud SQL

  1. Crea una instancia de segunda generación de Cloud SQL for MySQL. Asigna a la instancia el nombre de library o algo similar. La instancia puede tardar unos minutos en estar lista. Una vez que la instancia esté preparada, se debería poder ver en la lista de instancias.
  2. Utiliza ahora el SDK de Google Cloud de la línea de comandos y ejecuta el siguiente comando. Copia el valor que se muestra para connectionName en el siguiente paso.
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    El valor de connectionName tiene el formato [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME].

Inicializar la instancia de Cloud SQL

  1. Utiliza el connectionName del paso anterior para iniciar el proxy de Cloud SQL.

    Linux/Mac OS X

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

    Windows

    cloud_sql_proxy.exe -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

    Sustituye [YOUR_INSTANCE_CONNECTION_NAME] por el valor de connectionName que registraste en el paso anterior.

    Este paso establece una conexión del ordenador local a la instancia de Cloud SQL para fines de prueba local. Mantén el proxy de Cloud SQL en ejecución todo el tiempo durante la prueba local de la aplicación.

  2. A continuación, crea un nuevo usuario y base de datos de Cloud SQL.

    CONSOLA

    1. Crea una nueva base de datos usando la consola de GCP para tu instancia library de Cloud SQL. Por ejemplo, puedes usar el nombre bookshelf.
    2. Crea un nuevo usuario mediante la consola de GCP para tu instancia library de Cloud SQL.

    CLIENTE MYSQL

    1. En una pestaña de línea de comandos independiente, usa el cliente de MySQL o un programa similar para conectarte a la instancia. Usa la contraseña de raíz que configuraste cuando se te solicite.
      mysql --host 127.0.0.1 --user root --password
      
    2. Crea las bases de datos, los usuarios y los permisos de acceso necesarios en la base de datos de Cloud SQL mediante el uso de los siguientes comandos. Sustituye [MYSQL_USER] y [MYSQL_PASSWORD] por el nombre de usuario y contraseña que elijas.
      CREATE DATABASE bookshelf;
      CREATE USER '[MYSQL_USER]' IDENTIFIED BY '[MYSQL_PASSWORD]';
      GRANT ALL ON *.* TO '[MYSQL_USER]';
      

Establecer configuración

En esta sección, se usan códigos en el directorio de 2-structured-data. Edita los archivos y ejecuta los siguientes comandos en este directorio.

  1. Abre config.py para editarlo.
  2. Define el valor de PROJECT_ID en el ID del proyecto, que puede verse en la consola de GCP.
  3. Ajusta el valor de DATA_BACKEND en cloudsql.
  4. Ajusta el valor de CLOUDSQL_USER, CLOUDSQL_PASSWORD y CLOUDSQL_DATABASE en los valores que utilizaste al configurar la instancia de Cloud SQL. Para simplificar, puedes usar el usuario raíz y la contraseña raíz configurados al crear la instancia.
  5. Establece el valor de CLOUDSQL_CONNECTION_NAME en el nombre de la conexión de tu instancia de Cloud SQL. Esto debería ser visible en la consola de Google Cloud Platform, en los detalles de la instancia de Cloud SQL. Debería tener el formato project:region:cloudsql-instance.
  6. Guarda y cierra config.py.

Además, debes ajustar la configuración en app.yaml antes de desplegar la aplicación:

  1. Abre app.yaml para editarlo.
  2. Ajusta el valor de cloud_sql_instances al mismo que utilizaste en CLOUDSQL_CONNECTION_NAME de config.py . Debería tener el formato project:region:cloudsql-instance. Elimina los comentarios de toda esta línea.
  3. Guarda y cierra app.yaml.

Instalar dependencias

Introduce los siguientes comandos para crear un entorno virtual e instalar dependencias:

Linux/Mac OS X

virtualenv -p python3 env
source env/bin/activate
pip install -r requirements.txt

Windows

virtualenv -p python3 env
env\scripts\activate
pip install -r requirements.txt

Crear las tablas de la base de datos

La aplicación necesita crear las tablas de la base de datos utilizadas para almacenar los datos de la estantería. Este comando se conectará a la instancia de Cloud SQL y creará todas las tablas necesarias:

Linux/Mac OS X

python bookshelf/model_cloudsql.py

Windows

python bookshelf\model_cloudsql.py

Ejecutar la aplicación en la máquina local:

  1. Inicia un servidor web local:

    python main.py
    
  2. Introduce la siguiente dirección en el navegador web:

    http://localhost:8080

Ahora puedes navegar por las páginas web de la aplicación, donde podrás agregar, editar y eliminar libros.

Presiona Control + C para salir del servidor web local.

Desplegar la aplicación en el entorno flexible de App Engine

  1. Despliega la aplicación de muestra:

    gcloud app deploy
    
  2. En el navegador web, introduce la siguiente dirección. Sustituye [YOUR_PROJECT_ID] por el ID del proyecto:

    https://[YOUR_PROJECT_ID].appspot.com
    

Si actualizas la aplicación, podrás desplegar la versión actualizada con el mismo comando utilizado para desplegar la aplicación por primera vez. El nuevo despliegue crea una nueva versión de la aplicación y la establece como la versión predeterminada. Se conservan las versiones anteriores de la aplicación, al igual que las instancias de máquina virtual asociadas. Ten en cuenta que todas estas versiones de la aplicación y las instancias de máquina virtual son recursos facturables.

Si eliminas las versiones no predeterminadas de la aplicación, puedes reducir los costes.

Para eliminar una versión de la aplicación, sigue las instrucciones que figuran a continuación:

  1. In the GCP Console, go to the Versions page for App Engine.

    Go to the Versions page

  2. Select the checkbox for the non-default app version you want to delete.
  3. Click Delete to delete the app version.

Si quieres obtener información completa sobre cómo limpiar los recursos facturables, consulta la sección de limpieza en el último paso de este tutorial.

Estructura de la aplicación

Proceso de despliegue y estructura de la aplicación Bookshelf

La aplicación almacena todos los datos persistentes en Cloud SQL.

Comprender el código

En esta sección se explica detalladamente el código de la aplicación y su funcionamiento.

Gestionar los envíos de usuarios con formularios

El formulario HTML para añadir / editar permite a los usuarios añadir y editar presentaciones de libros dentro de la aplicación.

Imagen del formulario de añadir/editar

El formulario HTML se crea utilizando Jinja2, que es un motor de plantillas de Python. La siguiente plantilla de Jinja2 especifica que el formulario tiene campos de entrada de texto para Title (Título), Author (Autor), Date Published (Fecha de publicación) y Description (Descripción):

{% extends "base.html" %}

{% block content %}
<h3>{{action}} book</h3>

<form method="POST" enctype="multipart/form-data">

  <div class="form-group">
    <label for="title">Title</label>
    <input type="text" name="title" id="title" value="{{book.title}}" class="form-control"/>
  </div>

  <div class="form-group">
    <label for="author">Author</label>
    <input type="text" name="author" id="author" value="{{book.author}}" class="form-control"/>
  </div>

  <div class="form-group">
    <label for="publishedDate">Date Published</label>
    <input type="text" name="publishedDate" id="publishedDate" value="{{book.publishedDate}}" class="form-control"/>
  </div>

  <div class="form-group">
    <label for="description">Description</label>
    <textarea name="description" id="description" class="form-control">{{book.description}}</textarea>
  </div>

  <button type="submit" class="btn btn-success">Save</button>
</form>

{% endblock %}

Gestionar envíos de formularios

Cuando un usuario selecciona la opción Add Book (Añadir libro), la vista crud.add muestra el formulario. Cuando el usuario rellena el formulario y selecciona la opción de guardar, la misma función add maneja la acción HTTP POST del formulario e inicia el proceso de enviar los datos presentados a la base de datos de Cloud SQL pasándolos a la función model.create.

@crud.route('/add', methods=['GET', 'POST'])
def add():
    if request.method == 'POST':
        data = request.form.to_dict(flat=True)

        book = get_model().create(data)

        return redirect(url_for('.view', id=book['id']))

    return render_template("form.html", action="Add", book={})

El archivo bookshelf/model_cloudsql.py contiene el código que realiza funciones CRUD para los datos almacenados en la base de datos de Cloud SQL. La base de datos SQL se crea mediante un asignador relacional de objetos (ORM) llamado SQLAlchemy. Estos asignadores permiten interactuar con los modelos de datos como objetos de Python y generar la base de datos SQL equivalente. Otro ORM habitual con el que podrías haber trabajado es el ORM de Django.

Para simplificar la integración con Flask, usa la extensión Flask-SQLAlchemy.

Por ejemplo, la sentencia create en el código anterior llama a la función create en model_cloudsql.py, que actualiza el modelo de datos convirtiendo los atributos pasados como dict de Python en argumentos de palabra clave para el constructor de Book. Después añade el modelo a la sesión de la base de datos y confirma la sesión. SQLAlchemy convierte esto en una operación SQL INSERT y crea una nueva entrada de libro en la base de datos.

def create(data):
    book = Book(**data)
    db.session.add(book)
    db.session.commit()
    return from_sql(book)

Cuando un usuario edita la información de un libro después de haberse enviado, se llama a la función update de model_cloudsql.py, que consulta la entrada actual por su campo de id. Luego se replica por los campos actualizados y los edita en el modelo actual. Finalmente, la función confirma la sesión y, en este caso, SQLAlchemy convierte la edición en un modelo como una operación de SQL UPDATE.

def update(data, id):
    book = Book.query.get(id)
    for k, v in data.items():
        setattr(book, k, v)
    db.session.commit()
    return from_sql(book)

Después de que los usuarios hayan agregado libros, puedes hacer clic en el enlace de Books (Libros) para acceder a la página /books, que muestra todos los libros almacenados en la base de datos de Cloud SQL. La función list se ocupa de mostrar todos los libros usando datos recuperados de la base de datos de Cloud SQL.

def list(limit=10, cursor=None):
    cursor = int(cursor) if cursor else 0
    query = (Book.query
             .order_by(Book.title)
             .limit(limit)
             .offset(cursor))
    books = builtin_list(map(from_sql, query.all()))
    next_page = cursor + limit if len(books) == limit else None
    return (books, next_page)

Aquí puede ver cómo los métodos de objeto Python se pueden convertir al SQL apropiado. En el código anterior, el método limit especifica el número de registros que se van a devolver desde una base de datos, que a su vez añade una cláusula LIMIT a la SQL SELECT generada por la consulta. El método offset añade una cláusula OFFSET a la instrucción SELECT, que permite especificar un punto de partida para manejar la paginación y permite solicitar más páginas según el valor del cursor.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...