No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Reg铆strate

Comienza en:

3D
7H
53M
34S

Cambiando la base de datos a MySQL

12/27
Recursos

Aportes 51

Preguntas 21

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Incre铆ble la ventaja que da trabajar en Docker, me har茅 el curso de Docker para profundizar en el tema.

Para aquellos que les tira error y el docker no es recordar que sequelize necesita las librer铆a

npm i --save mysql2

Saludos

SI a alguien le da algun error al intentar conectarse al contendor de mysql, les dejo la configuraci贸n con la que me sirvio, muy similar a la de la clase, con un ligero cambio (:

 mysql:
        image: mysql:5
        environment:
            - MYSQL_DATABASE=my_store
            - MYSQL_USER=
            - MYSQL_ROOT_PASSWORD=admin123
            - MYSQL_PORT=3306
        ports:
            - "3306:3306"
        volumes:
            - ./mysql_data:/var/lib/mysql


Si a alguno le da error solo tiene que cambiar el puerto en mysql as铆 esto conecta el puerto 33061 de nuestro sistema operativo con el puerto 3306 del contenedor.

Este curso ha sido muy frustrante para mi. El Docker y Sequealize me han dado muchos problemas, no entiendo porqu茅.

Cuando vayan a ejecutar el servidor si les da error, en la variable de entorno deben colocar el puerto 33061 para que ejecute, ya que el contenedor de docker levanta mysql con el puerto 3306 y externamente el server se levanta con el puerto 33061 como esta en la imagen anterior.

Docker for MySQL 馃惉

.
鉁―efinici贸n de variables de entorno.

# mysql and docker
MYSQLDATABASE=thingst
MYSQLUSER=tester
MYSQLPASSWORD=14db7d47-f442-4a90-b633-2a537c8b5c13

鈾伙笍 Adici贸n de DB como servicio en Docker:

services:
    mysql:
        image: mysql
        restart: always
        ports:
            - 3306:3306
        environment:
            MYSQL_DATABASE: ${MYSQLDATABASE}
            MYSQL_ROOT_PASSWORD: ${MYSQLPASSWORD}
            MYSQL_USER: ${MYSQLUSER}
            MYSQL_PASSWORD: ${MYSQLPASSWORD}
        volumes:
            - ./db/mysql:/var/lib/mysql

Donde:

  • MYSQL_DATABASE. Define la base de datos con la que se trabajar谩.
  • MYSQL_ROOT_PASSWORD. Se define la contrase帽a del usuario root.
  • MYSQL_USER. Se define un usuario root con 谩mbito definida por MYSQL_DATABASE
  • MYSQL_PASSWORD. Se define la contrase帽a para el usuario MYSQL_USER.

.
馃敟 Finalmente, levantamos los servicios:
docker compose --env-file src/config/.env up -d

  • --env-file se cargan las variables de entorno definidas.
  • -d se levantan las instancia en modo silencioso

.
鈩癸笍 Para conectarse mediante clientes, el host permitido es mediante default del contenedor 0.0.0.0:3306

Buenas!
Si les aparece en el estado de la m谩quina de MySQL como 鈥淓xit 1鈥, lo que deben hacer es eliminar, del archivo docker-compose.yml, la siguiente variable:

MYSQL_USER=root

De esta forma iniciar谩 el sistema. (En versiones anteriores permit铆a agregar esa variable, ahora se toma por defecto como root si no existe).

Comando Descripcion
docker-compose up -d mysql Cambiando de DDBB
docker-compose ps Verificar si ya esta corriendo
docker-compose up -d phpmyadmin Levantando phpmyadmin
npm install --save mysql2 Driver para mysql
npm run dev Correr la base de datos

Al momento de querer levantar mysql su estado se quedaba en Exit 1.
Para arreglar ese problema dentro de docker-compose.yml en el apartado de volumes lo cambi茅.
Antes:
./mysql_data:/var/lib/mysql
Despu茅s:
"~/mysql_data:/var/lib/mysql"
Ahora al momento de subirlo a docker si est谩 en Up.

Para andar evitando re escribir que motor de Base de datos corremos, es mejor a帽adir que motor es en .env y a帽adirlo dentro de config.js

.env

DB_ENGINE=mysql

config.js

require('dotenv').config()

const config = {
  env: process.env.NODE_ENV || 'dev',
  dbHost: 'localhost',
  dbPort: process.env.MYSQL_PORT || 3000,
  dbUser: process.env.MYSQL_USER,
  dbPassword: process.env.MYSQL_PASSWORD,
  dbName: process.env.MYSQL_DATABASE,
  dbEngine: process.env.DB_ENGINE
}

module.exports = config

Yo tengo instalado MySQL Workbench en mi pc, por lo que me da un error al levantar el servicio de 鈥渕ysql鈥.
Sin embargo, hice un peque帽o cambio en el puerto para que funcione.

mysql:
    image: mysql:5
    environment:
      - MYSQL_DATABASE=my_store
      - MYSQL_USER=root
      - MYSQL_ROOT_PASSWORD=admin123
      - MYSQL_PORT=3306
    ports:
      - 3307:3306
    volumes:
      - ./mysql_data:/var/lib/mysql

al puerto que escucha el servicio lo cambie de 3306 al 3307. Espero les sirva.

Nico te explica hasta el ; GENIO!!!
que bien que se tomo la molestia de dar otro ejemplo con mysql

Me aparecia el estado del servicio de mysql en Exit 1
solo deje el usuario vacio y me funciono

Tengan cuidado con los tipos de datos decimales, en postgres funcional el NUMBER(escala,no.Decimal), pero en MYSQL no funciona. Se recomienda usar el tipo NUMERIC()

Para aquellos que les da el siguiente error: Host 鈥榅鈥 is not allowed to connect to this MySQL server, lo solucion茅 exponiendo el puerto, por otro lado, no es necesario el MYSQL_USER=root dado que mysql lo crea por default.

 mysql:
    image: mysql:5.7
    restart: always
    environment:
      - MYSQL_DATABASE=my_store
      - MYSQL_USER=userX
      - MYSQL_PASSWORD=useXPassword
      - MYSQL_ROOT_PASSWORD=admin123
    ports:
      - "3306:3306"
    expose:
      - "3306"
    volumes:
      - ./mysql_data:/var/lib/mysql

P.D.: las siguientes l铆neas se pueden omitir, 煤nicamente las agregu茅 para tener otro usuario MYSQL_USER=userX y MYSQL_PASSWORD=useXPassword

Si tiene una MacBook M1 y te muestra el siguiente mensaje al levantar el contener con MySQL:

ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries

Agrega esta l铆nea en el archivo docker-compose.yml:

platform: linux/amd64

Deber铆a quedar as铆:

 mysql:
    image: mysql:5
    platform: linux/amd64
    environment:
      - MYSQL_DATABASE=my_store
      - MYSQL_USER=menyin
      - MYSQL_ROOT_PASSWORD=admin123
      - MYSQL_ROOT_PORT=3306
    ports:
      - 3306:3306
    volumes:
      - ./mysql_data:/var/lib/mysql

Veo que muchos compa帽eros tuvieron dificultades, esto es normal cuando empezamos una nueva tecnologia, siempre hay detalles que debemos descubrir nosotros mismos. No se rindan, con paciencia y constancia lo lograra.
Yo soy usuario de WSL2 y asi esta mi codigo docker-compose.yml:

version: "3.8"

services:
  postgres:
    image: postgres:latest
    restart: always
    container_name: my_container_db
    environment:
      POSTGRES_DB: my_store
      POSTGRES_USER: maxdn
      POSTGRES_PASSWORD: admin123
    ports:
      - 5432:5432
    volumes:
      - /postgres_data:/var/lib/postgresql/data

  pgadmin:
    image: dpage/pgadmin4
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: root
    ports:
      - 5050:80

  mysql:
    image: mysql
    environment:
      MYSQL_DATABASE: my_store
      MYSQL_USER: oot
      MYSQL_ROOT_PASSWORD: admin123
      MYSQL_PORT: 3306
    ports:
      - 3306:3306
    volumes:
      - /mysql_data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      MYSQL_ROOT_PASSWORD: admin123
      PMA_HOST: mysql
    ports:
      - 8080:80

Cualquier duda comentar, saludos

Compa帽eros no olvidar crear la base de datos 鈥榤y_store鈥 en el gestor de bd phpMyAdmin

Si est谩n trabajando con alg煤n mac con procesador M1 es necesario agregar otra llave valor en el servicio de mysql:

platform: linux/x86_64

quedaria de la siguiente forma:

mysql:
    platform: linux/x86_64
    image: mysql:5
    environment:
      - MYSQL_DATABASE=my_store
      - MYSQL_USER=nico
      - MYSQL_ROOT_PASSWORD=admin123
      - MYSQL_PORT=3306
    ports:
      - 3306:3306
    volumes:
      - ./mysql_data:/var/lib/mysql

Les comparto la configuraci贸n que me funciono para conectar con SQL Server.

const { Sequelize } = require('sequelize');

const { config } = require('./../config/config');
const setupModels = require('./../db/models');

const USER = encodeURIComponent(config.dbUser);
const PASSWORD = encodeURIComponent(config.dbPassword);
const URI = `mssql://${USER}:${PASSWORD}@${config.dbHost}:${config.dbPort}/${config.dbName}`;

const sequelize = new Sequelize(URI, {
  dialect: 'mssql',
  logging: true,
  dialectOptions: {
        options: {
            enableArithAbort: false,
            cryptoCredentialsDetails: {
                minVersion: 'TLSv1'
            }
        }
    }
});

setupModels(sequelize);
sequelize.sync();

module.exports = sequelize;

Estuvo complicada la clase, no corria ni el contenedor ni la app, para el contenedor, tome la soluci贸n de varios comentarios aqui dejando MYSQL_USER= vac铆o y en el port puse 3307:3306, ya para la app si se quedo 鈥榬oot鈥 en el .env pero cambie el DB_PORT por 鈥3302鈥

Hola a todos!

Es posible que el puerto este en uso, para ello en el CMD como admin podemos terminar la tarea que lo tiene en uso:

  1. Primero buscamos el ID de la tarea
netstat -aon | findstr :3306
  1. Luego terminamos la tarea (el ID es el n煤mero de la derecha)
taskkill /pid IdTASK /F

Este tema de cambiar la fuente de las bases de datos me ha gustado muchisimo. Gracias profesor @nicobytes

No todos los tipos de de sequelize para postgres son soportados en mysql. Por si a alguien le pasa, mientras en postgres acepta el tipo array: en mysql no, as铆 que tuve que cambiar a J

DataTypes.ARRAY(DataTypes.STRING)
por 
DataTypes.JSON

SON.

隆Hola chicos!
Para los que no les funcionan al momento de hacer

docker-compose up -d sql

Si les da error , el nuevo servicio quedaria as铆 (O bueno este me funciono)

services:
	mysql:
    		image: mysql
   		restart: always
    		environment:
     	 		MYSQL_ROOT_PASSWORD: root
      			MYSQL_DATABASE: test_db
    		ports:
      			- "3307:3306"
    		volumes:
      			- ./mysql_data:/var/lib/mysql

Donde:
MYSQL_ROOT_PASSWORD Este es tu usuario y a la vez tu contrase帽a
MYSQL_DATABASE El nombre de la base de datos

Despues corren el PHPMYADMIN y funciona normal
Este es la estrategia que me funciono a m铆. 馃捇馃捇馃捇

hola muchachos para los que el handler no les funcion贸 o no les mostraba en la respuesta la secci贸n de 鈥渆rrors鈥 averig眉茅 un poco y posiblemente se ha actualizado la manera en que se puede tener acceso a ese detalle.

es solo remplazar:

errors: err.errors

por:

errors: err.details

en mi caso deje el middleware asi

  static sqlErrorHamdler(err, req, res, next) {
    if(err instanceof ValidationError) {
      console.log(err)
      res
        .status(409)
        .json({
          statusCode: 409,
          message: err.errors.message,
          details: err.errors
        })
    }
    next(err)
  }

API REFERENCE SEQUELIZE

Aqui les dejo la doumentacion de sequelize donde pueden ver los diferentes errores que maneja sequelize.

toca tener encuanta si tenemos el port de phpmyadmin si ya lo tenemos local que no este en uso ese puerto 3306.

para aquellos que quieran usar MariaDB deben usar la siguiente versi贸n, si to se optiene un error de meta

    "mariadb": "^2.3.3",

aqui el issue

estan actualizando eso aqui

Si a alquien le sale este error es porque el archivo docker-compose.yml debe estar correctamente identado!
me salia este error y me di cuenta que no tenia bien tabulado las lineas del c贸digo.

鈥淐onfiguration error - Version in 鈥./docker-compose.yml鈥 is unsupported.
You might be seeing this error because you鈥檙e using the wrong Compose file version.
Either specify a supported version (e.g 鈥2.2鈥 or 鈥3.3鈥) and place your service definitions under the services key, or omit the version key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

Vaya clase mas fea, estuve haciendo malabares y no pude solucionar los problemas, nose si es porque ya tenia instalado mysql workbench o que, pero fue demasiado frustante

para que todo me funcionara correctamente con el servicio de mysql, coloque el puerto 3307 en mi maquina local y el 3306 en el contenedor
docker-compose.yml:

version: '3.3'

services:
  postgres:
   ...

  pgadmin:
    ...

  mysql:
    image: mysql:5
    environment:
      - MYSQL_DATABASE=my-store
      - MYSQL_USER=root
      - MYSQL_ROOT_PASSWORD=toor
      - MYSQL_PORT=3306
    ports:
      - 3307:3306
    volumes:
      - ./mysql_data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - MYSQL_ROOT_PASSWORD=toor
      - PMA_HOST=mysql
    ports:
      - 8080:80

corremos los servicios

docker-compose up -d mysql 
docker-compose up -d phpmyadmin

modificamos puerto en las variables de entorno
.env:

PORT=3000
DB_USER='root'
DB_PASSWORD='toor'
DB_HOST='localhost'
DB_NAME='my-store'
DB_PORT='3307' // puerto en mi maquina local donde corre el contenedor mysql 

modificamos lenguaje y string de conexi贸n
libs/sequelize.js:

const { Sequelize } = require('sequelize')
const { config } = require('../config/config')
const setupModels = require('../db/model/index')

const USER = encodeURIComponent(config.dbUser)
const PASSWORD = encodeURIComponent(config.dbPassword)
const URI = `mysql://${USER}:${PASSWORD}@${config.dbHost}:${config.dbPort}/${config.dbName}`

const sequelize = new Sequelize(URI, {
  dialect: 'mysql',  
  logging: true
})

setupModels(sequelize)

sequelize.sync()

module.exports = sequelize

corremos la aplicaci贸n

npm run dev 

insertamos algunos registros con una petici贸n POST a la url 鈥/api/v1/users/鈥

{
  "email": "[email protected]",
  "password": "12345678"
}
{
  "email": "[email protected]",
  "password": "12345678"
}

luego hacemos una petici贸n GET a la misma url, veremos como respuesta

[
  {
    "id": 1,
    "email": "[email protected]",
    "password": "12345678",
    "createdAt": "2023-02-28T17:57:02.000Z"
  },
  {
    "id": 2,
    "email": "[email protected]",
    "password": "12345678",
    "createdAt": "2023-02-28T17:57:07.000Z"
  }
]

y todo estar铆a funcionando correctamente con mysql corriendo bien

Perd铆 mi tiempo nom谩s con MySQL, no pude hacerlo funcionar, con nada 馃槮

LIKE A ESTA CLASE
A pesar de los errores jajaja

Hola, tambi茅n tuve problemas al hacer la conexi贸n con mysql,

  1. Al momento de querer levantar mysql su estado se quedaba en Exit 1.
  2. ConnectionError [SequelizeConnectionError]: Unknown database 鈥榤y_store鈥.

Por ac谩 les comparto mi soluci贸n.

  • Primero como ya ten铆a instalado el Workbench no me deja usar el mismo puerto por defecto de mysql (3306), por tanto, use el puerto que ya otros compa帽eros recomendaron, el puerto 33060.
  • Segundo no me dejaba colocar la ruta de la carpeta en 鈥渧olumes鈥 con el punto (.) sino con la virgulilla (~) .
#docker-compose.yml
  mysql:
    image: mysql:5
    restart: always
    environment:
      - MYSQL_DATABASE=my_store
      - MYSQL_USER=root
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_PORT=3306
    ports:
      - 33060:3306
    volumes:
      - ~/mysql_data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - PMA_HOST=mysql
    ports:
      - 8080:80

Como tuve que cambiar el puerto en el servicio de mysql, tambi茅n se tiene que cambiar en el archivo .env para que se pueda realizar una correcta conexi贸n la bd.

#.env
PORT = 3000
DB_USER='root'
DB_PASSWORD='root'
DB_HOST='localhost'
DB_NAME='my_store'

# === DB_PORT FOR MYSQL ===
DB_PORT='33060'

# === DB_PORT FOR POSTGRES ===
# DB_PORT='5432'

Saludos.

Para los que tengan MAC con chip M1 y les sale en la consola: 鈥渘o matching manifest for linux/arm64/v8 in the manifest list entries鈥.

馃憠馃徎Aqu铆 la soluci贸n:
solo tienen que agregar esto a su archivo YML:

platform: linux/x86_64
image: mysql:5

Esto no les solucionar谩 el problema de ra铆z pero su los dejar谩 seguir haciendo el curso.

Link de donde encontr茅 soluci贸n

Para los que est茅n trabajando en MAC con los Chip M1, y les sale el siguiente error al levantar el contenedor de mysql

no matching manifest for linux/arm64/v8 in the manifest list entries

Tienen que agregar la siguiente l铆nea en la definici贸n del servicio:

mysql:
    **platform: linux/x86_64**
    image: mysql:5
    environment:
      - MYSQL_DATABASE=my_store
      - MYSQL_USER=root
      - MYSQL_ROOT_PASSWORD=admin123
      - MYSQL_PORT=3306
    ports:
      - 3306:3306
    volumes:
      - ./mysql_data:/var/lib/mysql

que genial y que f谩cil es hacer estas migraciones, me esta gustando much铆simo el curso.

tienen que instalar la herramienta de conexi贸n de sequelize para MySQL

npm install --save mysql2

para los que tengan este error

HostNotFoundError [SequelizeHostNotFoundError]: getaddrinfo ENOTFOUND localhost

lo solucione exponiendo el puerto la instancia de sequelize

const sequelize = new Sequelize(URI, {
  dialect: 'mysql',
  logging: true,
  port: PORT
});

Llevo a帽os usando Linux y para hacer mis cosas lidiaba con dependencias y paquetes, de ahora en adelante; solo lidiar茅 con Docker

No se si alguien mas se percato de que sucede cuando ingresas un correo ya existente, y es que empieza a asignar ID en blanco (Aunque no aparezcan en la tabla) no se si esto es algo bueno o malo

docker-compose.yml

version: '3.3'

services: 
  postgres:
    image: postgres:13
    environment:
      - POSTGRES_DB=my_store
      - POSTGRES_USER=nico
      - POSTGRES_PASSWORD=admin123
    ports:
      - 5432:5432
    # Persitencia bd
    volumes: 
      - ./postgres_data:/var/lib/postgresql/data
      
  # interfaz grafica 
  pgadmin:
    image: dpage/pgadmin4
    environment:
      - [email protected]
      - PGADMIN_DEFAULT_PASSWORD=root
    ports:
      - 5050:80
  
  mysql:
    image: mysql:5
    environment: 
      - MYQSL_DATABASE=my_store
      - MYSQL_USER=
      - MYSQL_ROOT_PASSWORD=admin123
      - MYSQL_PORT=3306
    ports: 
      - 3306:3306
    volumes: 
      - ./mysql_data:/var/lib/mysql
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - MYSQL_ROOT_PASSWORD=admin123
      - PMA_HOST=mysql # nombre del servicio mysql
    ports:
      - 8080:80

Si alguien esta teniendo problemas con la imagen de mysql en docker en una mac con m1, la soluci贸n puede ser lo siguiente.

Agregar en el archivo de docker antes de indicar la imagen de mysql.

platform: linux/x86_64

para mac con chip m1 agrgar esto, fue la unica manera de poder usar la imagen de lo contrario tenia un error (no matching manifest鈥):
mysql:
platform linux/x86_64
image:
mysql:5

incre铆ble clase, ya estoy viendo la importancia de saber utilizar docker

Para aquellos que est谩n usando una MBP M1 y tenga problemas para correr la imagen de MySQL, solo deben agregar la platform: linux/x86_64.

mysql:
    platform: linux/x86_64
    image: mysql:5
    environment:
      - MYSQL_DB=my_store
      - MYSQL_USER=nico
      - MYSQL_ROOT_PASSWORD=admin123
      - MYSQL_PORT=3306
    ports:
      - 3306:3306
    volumes:
      - ./mysql_data:/var/lib/mysql

Saludos y espero les sea de utilidad!

Si tienen problemas iniciando el contenedor pueden intentar correr el comando docker logs seguido del id del contenedor para tener m谩s informaci贸n para poderlo debugear.
Pueden obtener el id del contenedor con el comando docker ps -al.

para los que salgan error al ejecutar el mysql con docker y no tengan usando el puerto 3306 dabien deben ver los espacios en archivo doker-compose.yml, ya que ami me faltaba darle un tab el mysql al crear su contendedor al inicio del mysql xd

Todo muy claro, gran clase y sobre todo integraci贸n con DOCKER.