¿Qué es un ORM?

ORM es una palabra muy frecuente escucharla cuando trabajas con los web-frameworks modernos, pero en realidad no se refiere a ninguna herramienta en concreto, es mas bien un técnica de programación.

ORM son las siglas de Object Relational Mapping y traducido sería algo así como, Mapeo Objeto-Relacional; pero para entender que quiere decir esto, primero debemos conocer cual es el problema que intenta solucionar esta técnica.

El problema

  1. La mayoría de las aplicaciones hoy en día usan bases de datos para almacenar su información.
  2. Las bases de datos que dominan el  mercado en la actualidad son relacionales.
  3. El paradigma implementado por los lenguaje más populares es el orientado a objetos (muchas veces junto con otros como, el funcional pero de eso hablaré en otra oportunidad).

Esto ocasiona que los programadores tengamos que estar traduciendo de una lenguaje orientado a objetos a otro relacional y viceversa cada vez que vayamos a hacer operaciones en la base de datos.

Traductor

El ORM es una capa intermedia que hace la traducción entre el lenguaje que entiende la base de datos SQL, es decir, relacional, y el que entiende nuestro lenguaje de programación, orientado a objetos.

doctrine_image_1

Hay varios patrones para hacer la implementación de un ORM, como por ejemplo el data mapper que usa Doctrine2 o Activerecord de Rails y Laravel, el resultado es el mismo:

Relacional Orientado a Objetos
Tabla Clase
Registro Objeto
Columna Propiedad

Los Modelos y el MVC

Dentro del patrón arquitectónico MVC (Model-View-Controller) o similares, como el MVT (Model-View-Template) de Django, es común encontrar la implementación del ORM dentro de la clase que gestiona los modelos, entonces:

  • Cada clase model corresponde a una tabla de la base de datos (con sus excepciones como las tablas pivot de las relaciones many-to-many).
  • Cada instancia de la clase model representa un registro de la tabla a la cual hace referencia dicho modelo.
  • Cuando se accede a una propiedad del objeto implica que se esta recuperando el dato correspondiente a la columna del mismo nombre en la tabla de la base de datos.

Relaciones entre tablas

Un ORM no estaría completo sin la capacidad de representar las relaciones entre tablas de la base de datos en clases y objetos de manera confiable y sin añadir demasiada complejidad:

Recuerda: tablas = clases y propiedades de la clase = campos de la tabla

Relación Clase A Clase B
uno a uno A tiene un objeto de la Clase B entre sus propiedades B tiene un objeto de la Clase A entre sus propiedades
uno a muchos A tiene una colección de objetos de la Clase B como una de sus propiedades B tiene un objeto de la Clase A entre sus propiedades
muchos a mucho A tiene una colección de objetos de la Clase B como una de sus propiedades B tiene una colección de objetos de la Clase A como una de sus propiedades

Consultas

Así como en SQL tienen un lenguaje de definición de datos y otro para la manipulación de los mismos, en un ORM también cuenta con herramientas para hacer consultas; todas esas cosas de los joins, group by, order by, link, and, or, betwent, etc, están en los ORMs, pero la verdad es que, esta es el área donde más varia uno de otro, algunos usan métodos con los mismos nombres o muy similares a las operaciones antes mencionadas, mientras que otros buscan un enfoque totalmente alejado de la lógica relacional, esta será la parte que más tiempo te llevará aprender en comparación con el resto, pero si tienes un buen diseño de tu base de datos y entiendes de SQL no te tomará demasiado.

Un solo ORM para varios motores de bases de datos

Otra característica de usar un ORM, es que estos en la mayoría, van contra un varios manejadores de bases de datos, es decir, difícilmente vayas a trabajar con un ORM que solo vaya contra MySQL y entonces cuando quieras cambiar a PostgreSQL tengas que dejarlo por usar otro, sino que sigues usando el mismo tanto para MySQL, para PostgreSQL, para SQLite, etc, sin tener que modificar tu código fuente. ¿Dime si solo eso no es suficiente razón para que te animes a probar un ORM?.

 

 

Lecturas recomendadas:

ORM recomendados:

Crear, activar y desactivar entornos virtuales con Virtualenv

Creación

Bien una vez tengamos instalado virtualenenv (las instrucciones para instalarlo puedes encontrarlas en este acá) para crear un entorno virtual solo tenemos que escribir virtualenv y un nombre para nuestro entorno virtual, así:

~$ virtualenv my_enviroment
New python executable in my_enviroment/bin/python
Installing setuptools, pip, wheel...done.

Si queremos especificar una versión de python diferente a la que por defecto nos brinda el sistema operativo, podemos especificarlo con la opción -p de esta manera:

~$ virtualenv my_enviroment3 -p /usr/bin/python3

Activación

El paso anterior nos creará un directorio de con el nombre que le hayamos dado a nuestro entorno virtual, nuestro caso my_enviroment, dentro del el debemos buscar el script activate y pasarlo como argumento al comendo source:

~$ source my_enviroment/bin/activate

si todo va bien el promt de nuestra terminal debe verse similar a esto:

(my_enviroment):~$

cuando el promt se encuentre de esta forma, todo los cambios que hagamos a nuestro entorno python se hará de forma local sin afectar a la instalación del sistema.

Desactivación

Para desactivar el entorno virtual solo debemos escribir la palabra deactivate en nuestra terminal:

(my_enviroment):~$ deactivate

El promt volverá a su forma inicial sin el nombre del entorno virtual entre paréntesis al principio

Cómo instalar Whoops en Laravel 5.1

whoops-ssLamentablemente Whoops el paquete que nos permitía en la versión 4 de Laravel tener una interfaz de debug linda y amigable no viene incluido por defecto en Laravel 5.x, sin embargo no es tan complicado agregarlo.

En la carpeta de nuestro proyecto en Laravel escribimos esto en la terminal:

~$ composer require filp/whoops

esto modificará nuestro archivo composer.json, e instalará whoops en el directorio vendor de nuestro proyecto.

Luego abrimos con el editor de texto de nuestra preferencia el archivo app/Exceptions/Handler.php y editamos el método render() de la siguiente forma:

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    if ($this->isHttpException($e))
    {
        return $this->renderHttpException($e);
    }


    if (config('app.debug'))
    {
        return $this->renderExceptionWithWhoops($e);
    }

    return parent::render($request, $e);
}

/**
 * Render an exception using Whoops.
 * 
 * @param  \Exception $e
 * @return \Illuminate\Http\Response
 */
protected function renderExceptionWithWhoops(Exception $e)
{
    $whoops = new \Whoops\Run;
    $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler());

    return new \Illuminate\Http\Response(
        $whoops->handleException($e),
        $e->getStatusCode(),
        $e->getHeaders()
    );
}

Y eso es todo, ahora deberías tener tener whoops activo en tu proyecto.

 

Fuente: mattstauffer.co

Activar extensión Mcrypt de PHP en Ubuntu 15.10

Instalamos via gestor de paquetes del sistema operativo php5-mcrypt:

~$ sudo aptitude install php5-mcrypt

Luego lo habilitamos con el comando php5enmod:

~$ sudo php5enmod mcrypt

Si estamos trabajando con php y apache (que es lo mas común), para que el servidor web tome estos cambios debemos reiniciarlo:

~$ sudo service apache2 restart

 

Cómo instalar Composer

Estas instrucciones las puedes encontrar en la web de composer en su la sección download.

Abrimos una terminal y ejecutamos.

~$ curl -sS https://getcomposer.org/installer | php

Sino tenemos instalado curl podemos hacerlo a través del gestor de paquetes de nuestra distribución; si no podemos instalar curl podemos cambiar el comando de arriba por:

~$ php -r "readfile('https://getcomposer.org/installer');" | php

una vez hecho esto tendremos en nuestro computador un archivo de nombre composer.phar, el cual ejecutamos con:

~$ php composer.phar

y nos debe dar una salida parecida a esta:

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.0-dev (b6bac0c2d31e4f84d607638277322d8d256e61af) 2015-11-29 17:21:38

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  about           Short information about Composer
  archive         Create an archive of this composer package
  browse          Opens the package's repository URL or homepage in your browser.
  clear-cache     Clears composer's internal package cache.
  clearcache      Clears composer's internal package cache.
  config          Set config options
  create-project  Create new project from a package into given directory.
  depends         Shows which packages depend on the given package
  diagnose        Diagnoses the system to identify common errors.
  dump-autoload   Dumps the autoloader
  dumpautoload    Dumps the autoloader
  global          Allows running commands in the global composer dir ($COMPOSER_HOME).
  help            Displays help for a command
  home            Opens the package's repository URL or homepage in your browser.
  info            Show information about packages
  init            Creates a basic composer.json file in current directory.
  install         Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  licenses        Show information about licenses of dependencies
  list            Lists commands
  remove          Removes a package from the require or require-dev
  require         Adds required packages to your composer.json and installs them
  run-script      Run the scripts defined in composer.json.
  search          Search for packages
  self-update     Updates composer.phar to the latest version.
  selfupdate      Updates composer.phar to the latest version.
  show            Show information about packages
  status          Show a list of locally modified packages
  suggests        Show package suggestions
  update          Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate        Validates a composer.json and composer.lock

Si te dio una salida parecida, eso quiere decir que ya tienes composer funcional en tu equipo. Ahora solo resta un ultimo paso, para tener composer de forma global y no tener que descargar el archivo en cada proyecto en el cual vayamos a trabajar, debemos mover nuestro archivo composer.phar al directorio /usr/local/bin:

~$ sudo mv composer.phar /user/local/bin/composer

Ahora si escribimos composer en nuestra terminal, sin importar el directorio donde nos encontremos, debería producirse la misma salida que cuando escribimos php composer.phar.

~$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.0-dev (b6bac0c2d31e4f84d607638277322d8d256e61af) 2015-11-29 17:21:38

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  about           Short information about Composer
  archive         Create an archive of this composer package
  browse          Opens the package's repository URL or homepage in your browser.
  clear-cache     Clears composer's internal package cache.
  clearcache      Clears composer's internal package cache.
  config          Set config options
  create-project  Create new project from a package into given directory.
  depends         Shows which packages depend on the given package
  diagnose        Diagnoses the system to identify common errors.
  dump-autoload   Dumps the autoloader
  dumpautoload    Dumps the autoloader
  global          Allows running commands in the global composer dir ($COMPOSER_HOME).
  help            Displays help for a command
  home            Opens the package's repository URL or homepage in your browser.
  info            Show information about packages
  init            Creates a basic composer.json file in current directory.
  install         Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  licenses        Show information about licenses of dependencies
  list            Lists commands
  remove          Removes a package from the require or require-dev
  require         Adds required packages to your composer.json and installs them
  run-script      Run the scripts defined in composer.json.
  search          Search for packages
  self-update     Updates composer.phar to the latest version.
  selfupdate      Updates composer.phar to the latest version.
  show            Show information about packages
  status          Show a list of locally modified packages
  suggests        Show package suggestions
  update          Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate        Validates a composer.json and composer.lock

 

Fuente: getcomposer.org

Cómo instalar Virtualenv en Ubuntu 15.10

Lo primero que tenemos que hacer es instalar el paquete python-setuptools:

~$ sudo aptitude install python-setuptools

Luego con easy_install instalamos pip:

~$ sudo easy_install pip

Después con pip instalamos virtualenv:

~$ sudo pip install virtualenv

Debemos colocar sudo tanto para el comando easy_install como para pip, porque al igual que aptitude realizarán cambios en los directorios del sistema.

con esto ya tenemos instalado virtual en nuestro sistema operativo, listo para usar.

Cómo instalar MariaDB en Ubuntu 15.10

Abrimos una terminal y escribimos

~$ sudo aptitude install mariadb-common mariadb-server mariadb-client

si ya has instalado mysql en otras ocasiones te llamará la atención que en proceso de instalación no te haya pedido especificar la clave del usuario superadministrador (root), tampoco puedes asignarlo a través del comando:

mysql_secure_installation

nos lanzará un error parecido a este:

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Enter current password for root (enter for none):

para corregir este error primero nos iniciamos sesión en cli de mysql de la siguiente forma:

sudo mysql -u root

y ejecutamos las siguientes instrucciones:

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set plugin='' where User='root';
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0
flush privileges;
Query OK, 0 rows affected (0.00 sec)

Una vez hecho esto, salimos del cli con:

MariaDB [mysql]> \q
Bye

Ahora si podemos asignar el password al usuario root con el comando:

mysql_secure_installation

Dejamos la opciones por defecto:

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): 
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] 
 ... Success!
Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] 
 ... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] 
 - Dropping test database...
ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist
 ... Failed!  Not critical, keep moving...
 - Removing privileges on test database...
 ... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] 
 ... Success!
Cleaning up...
All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!

verificamos que este corriendo MariaDB:

sudo service mysql status

Probamos iniciar sesión en el cli con:

mysql -u root -p

Deberíamos poder ingresar el password que hemos asignado ;-).

 

Fuente: www.unixmen.com