jueves, 31 de mayo de 2018

Jugando con Knex - parte 3

Al salir el error: Error: ER_TABLE_EXISTS_ERROR: Table 'login' already exists, la mejor opción es borrar las tablas manualmente.

Para añadir nuevas funciones al sistema, se está creando una tabla más, 'login', y cambiando el contenido de la tabla 'users' que contendrá información del usuario. Parece que debido al enlace entre las tablas 'users' y 'todos' no es tan sencillo borrar e incluir las nuevas tablas, pero luego de borrar las tablas manualmente con phpMyAdmin, el proceso con Knex se puede hacer sin problemas.

martes, 15 de mayo de 2018

Jugando con Knex - Parte 2

Siguiendo con la lucha. Al ejecutar el filtrado de TODOS por id de usuario, Knex devuelve un resultado malformado. El id de la respuesta absorve el valor del id del usuario y la lista no se puede identificar adecuadamente, no está ordenado por el id de TODOS.

Resultado:
[{
"id":3,
"title":"go to the gym",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"stop the damn leafblowers",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"get the mail",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"get some headphones",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
}]

Comprobé el error en phpMyAdmin, ejecutando el código SQL:

SELECT * FROM `todos` INNER JOIN `users` ON `todos`.`user_id` = `users`.`id` WHERE `todos`.`user_id` = 3

Donde se muestran todas las columnas de las tablas.
Para corregir el problema, escogí establecer las columnas que debería devolver Knex, como en este SQL:

SELECT `todos`.`id`, `todos`.`title`, `todos`.`completed`, `todos`.`created_at`, `todos`.`updated_at`, `users`.`name`, `users`.`email` FROM `todos` INNER JOIN `users` ON `todos`.`user_id` = `users`.`id` WHERE `todos`.`user_id` = 3

Para eso se usa .column. Ciertamente más sencillo de construir con Knex que con SQL y el backtick.

El resultado es diferente:

[{
   "id":3,
   "title":"go to the gym",
   "completed":0,
   "created_at":"2018-05-10T03:33:42.000Z",
   "updated_at":"2018-05-10T03:33:42.000Z",
   "name":"Someone Else ",
   "email":"test3@test.com"
},
{
   "id":4,
   "title":"stop the damn leafblowers",
   "completed":0,
   "created_at":"2018-05-10T03:33:42.000Z",
   "updated_at":"2018-05-10T03:33:42.000Z",
   "name":"Someone Else ",
   "email":"test3@test.com"
},
{
   "id":5,
   "title":"get the mail",
   "completed":0,
   "created_at":"2018-05-10T03:33:42.000Z",
   "updated_at":"2018-05-10T03:33:42.000Z",
   "name":"Someone Else ",
   "email":"test3@test.com"
},
{
   "id":6,
   "title":"get some headphones",
   "completed":0,
   "created_at":"2018-05-10T03:33:42.000Z",
   "updated_at":"2018-05-10T03:33:42.000Z",
   "name":"Someone Else ",
   "email":"test3@test.com"
}]

lunes, 7 de mayo de 2018

Jugando con Knex - Parte 1

Siguiendo con la lucha para dominar JS, TypeScript, Node y poder manipular RDBMS.

Encontré este ejemplo con knex[GitHub], haciendo las respectivas modificaciones para usar MySQL en lugar de PostgreSQL, pero he estado sufriendo para poder ejecutarlo correctamente.

Usando el código tal cual, sale el siguiente error:
~knex-intro/youtube-intro-to-knex/db> knex migrate:make create_users_and_todos_tables
module.js:471
    throw err;
    ^

Error: Cannot find module './dialects/[object KnexClient]/index.js'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Knex (/home/ikari/workshop/OWN/knex-intro/youtube-intro-to-knex/node_modules/knex/lib/index.js:55:15)
    at initKnex (/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:69:10)
    at Command. (/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:116:22)
    at Command.listener (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:315:8)
    at emitTwo (events.js:106:13)
    at Command.emit (events.js:191:7)
    at Command.parseArgs (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:651:12)
    at Command.parse (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:474:21)
    at Liftoff.invoke (/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:186:13)
    at Liftoff.execute (/usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:203:12)
    at module.exports (/usr/local/share/.config/yarn/global/node_modules/flagged-respawn/index.js:51:3)
    at Liftoff. (/usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:195:5)
    at /usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:165:9
    at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:108:14
    at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:35:14
    at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:47:7
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)
El error se encuentra en el archivo knexfile.js, ya que al cambiarlo por lo que tengo disponible, el error no es visible. Y también por que encontré que el autor consultó al respecto: Knex migrate and seed CLI commands throwing error [Github]. Aplicando el cambio requerido, no hay problema en la ejecución del comando.