hefestoapicontainer

Almacenamiento en base de datos

Puedes crear una base de datos en Postgres asociada a una API de forma que quede aislada del resto de bases de datos de otras APIs.

Para crear una base de datos añade estos endpoints a tu API:

    delete /database:
        Drop:
            directive: DatabaseDrop
    post /database:
        Create:
            directive: DatabaseCreate
        Connect:
            directive: DatabaseConnect
        Migrate:
            directive: DatabaseMigrate
            files: "Assets/db/"
    post /database/migrate:
        Connect:
            directive: DatabaseConnect
        Migrate:
            directive: DatabaseMigrate
        files: "Assets/db/"

Mediante el endpoint delete podrás borrar tu base de datos.

Mediante el endpoint post /database, se creará la base de datos y se ejecutarán todas las migraciones.

Mediante el endpoint post /database/migrate, se ejecutarán todas las migraciones no ejecutadas previamente de una base de datos que ya fue creada en el pasado.

Las migraciones son ficheros sql alojados en Assets/sql, que tendrán estos nombres:

    001_create_table_users.sql
    002_create_table_companies.sql
    003_create_index_name_to_users.sql

Primero se ejecutará la 001, luego la 002, etc.

Los ficheros contendrán sintaxis SQL de postgres, por ejemplo 001_create_table_users.sql podría contener:

    CREATE TABLE users (
        id VARCHAR ( 120 ) PRIMARY KEY,
        name VARCHAR ( 120 ) NOT NULL,
        created_at TIMESTAMP NOT NULL
    );

Puedes habilitar la extensión PostGIS ejecutando la siguiente sentencia SQL:

    CREATE EXTENSION postgis;

Una vez has creado tu base de datos y tus tablas, puedes conectarte en cualquier endpoint con la directiva DatabaseConnect, por ejemplo:

    post /user:
        LoadUser:
            directive: LoadAndValidateModel
            source: $.message.bodyAsArray
            target: user
        Connect:
            directive: DatabaseConnect
        SaveUser:
            directive: SaveUser
            user: $.memory.user

Este endpoint recibe un JSON con un usuario, lo valida, se conecta a la base de datos de la API mediante DatabaseConnect y almacena el usuario mediante SaveUser. SaveUser es una directiva que habría que desarrollar, y que podría tener esta forma:


    $db = $state->memory()->get('db-conn');

    $user = $config['user'];

    $sth = $db->prepare('SELECT id FROM users WHERE name = ?');
    $sth->execute([$user['name']]);
    $data = $sth->fetchObject();
    if (isset($data->id)) {
        return;
    }

    $sth = $db->prepare(
        'INSERT INTO users ( 
            name,
            created_at ) 
        VALUES( ? ,NOW() )'
    );
    $sth->execute([
        $user['name']
    ]);

Una vez realizada la conexión a base de datos con DatabaseConnect, se almacena en memory dicha conexión para que la puedas utilizar desde cualquier directiva. Puedes recuperarla con: $state->memory()->get('db-conn').

La conexión recuperada, es una conexión PDO de php, por lo que podrás utilizar todos los métodos de PDO, tal como se muestra en el ejemplo anterior.

Ir a la home