rocketseat-education / bootcamp-gostack-desafios

Repositório contendo todos os desafios dos módulos do Bootcamp Gostack
https://pages.rocketseat.com.br/gostack
MIT License
1.18k stars 999 forks source link

Desafio 06: Function uuid_generate_v4() does not exists #48

Closed fiote closed 4 years ago

fiote commented 4 years ago

Ao usar uuid_generate_v4 no default das colunas primárias das migrations do postgre, esse erro (Function uuid_generate_v4() does not exists) acontece e impede que as migrations sejam executadas.

No discord me passaram a solução, que é simplesmente executar CREATE EXTENSION IF NOT EXISTS "uuid-ossp" lá pelo DBeaver no banco gostack_desafio06 que a gente cria (essa parte de criar o banco faz parte do passo-a-passo).

Só que seguindo o fluxo do curso, a gente faz esse desafio do upload logo depois da aula de backend do gobarber. E na aula do gobarber esse step por algum motivo não é necessário então o aluno fica achando que tem algum bug acontecendo. Deveria 'simplesmente funcionar'.

Acho que seria interessante criar uma seção 'problemas frequentes' ou algo assim na descrição desse desafio com essa solução. Eu entendo que 'configurar ambiente' faz parte das tarefas do dev, mas a partir do momento que vocês estão disponibilizando um template pra ser clonado como material do curso (e até agora o yarn install sempre deixou o ambiente pronto pra ser usado), acho válido assumir que não vamos perder muito tempo buscando esse tipo de solução no stackoverflow ou algo do tipo, e que vamos poder simplesmente sentar e 'bora codar', hehe

tupizz commented 4 years ago

Então, também fiquei na dúvida pq durante a aula funcionou e na base de cógido do template não... 🤔🤔 Eu setei as mesmas versões do typeorm e client pg... Conseguiriam explicar? (só de curiosidade mesmo, o erro foi resolvido de fato)

ref: https://github.com/typeorm/typeorm/issues/3009

@diego3g @josepholiveira

tupizz commented 4 years ago

https://skylab.rocketseat.com.br/h/forum/gostack-11/a95b757d-2742-4678-9b91-0f3a41415588#92159bf6-6f87-44ba-afbc-098011448900

Talvez, após criar os modelos com o typeorm por default e debaixo dos panos ele verifica a estratégia de utilização para geração do id e caso seja 'uuid' ele por si só roda o comando que tivemos que rodar. x)

josepholiveira commented 4 years ago

Faala @fiote e @tupizz, beleza?

Então, entendo essa dúvida de vocês, mas esse erro pode acabar acontecendo por alguns motivos diferentes, seja algum problema no container do docker, ou por exemplo em alguns casos configurando corretamente a Model já deve resolver o problema.

Porque não criamos uma área de problemas frequentes? Justamente porque esse é um problema que não vai acontecer exatamente de uma forma igual para todo mundo e no fórum, como o @tupizz mandou ali, já existem algumas soluções para isso de outras pessoas que passaram pelo mesmo problema.

Sobre a parte de "Direto pro código", vale a pena lembrar que programação não é só código, muitas vezes passamos por diversos tipos de problemas, seja esse por conta da forma que escrevemos o código ou não, e temos que sempre lembrar que nós como programadores não só criamos código, mas resolvemos problemas, e passar por esse tipo de problema é totalmente normal.

Os desafios tem totalmente o objetivo de desafiar, como diz o nome. Acreditamos que o template já facilita esse desafio bastante, mas a parte principal do desafio é aprender a lidar com os problemas e resolve-los, e um processo importante disso é pesquisar, ajudar ou receber ajuda.

Espero que tenham entendido, e lembrem-se que sempre que tiverem uma dúvida técnica, podem enviar diretamente no fórum, pois nosso atendimento é exclusivo por lá para esse tipo de dúvida. E para dúvidas não técnicas optem pelo discord ou pelo e-mail oi@rocketseat.com.br.

Abraços!

nennogabriel commented 4 years ago

Tente adicionar a linha await queryRunner.query(CREATE EXTENSION IF NOT EXISTS "uuid-ossp"); na primeira migration. Isso fará com que o postgres instale o modulo caso ele não tenha.

AllanFont3s commented 4 years ago

Eu resolvi da seguinte forma: Fui no DBeaver, no banco de dados que eu criei, com o botão direito do mouse em cima do símbolo do Banco de dados existe a opção create, acompanhando as opções que se abrem tem a opção extension, uma das últimas opçoes lá dentro é a tão procurada uuuid-ossp, pronto, é só habilitar essa opção. Depois que dermos um npm run typeorm migration:run no vscode, ele vai criar nossas tabelas. Quando voltarmos para verificarmos se as tabelas foram criadas é importante dar um refresh.

jpcmf commented 4 years ago

Enfrentei o mesmo problema e resolvi com a dica do @nennogabriel e desse link no Stack Overflow 👍

public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"');
    .
    .
    .
rivanbello commented 3 years ago

Esse problema ocorreu comigo quando tentei rodar as migrations sem ser um super usuário. Utilizei o docker para criar o container, criei um usuário com nome customizado, assim perdendo o poder de super usuário. Depois recriei container sem definir um nome para o usuário (o padrão é "postgres"), só defini a senha, então deu tudo certo em rodar as migrations.

joaopaulu commented 3 years ago

Eu resolvi da seguinte forma: Fui no DBeaver, no banco de dados que eu criei, com o botão direito do mouse em cima do símbolo do Banco de dados existe a opção create, acompanhando as opções que se abrem tem a opção extension, uma das últimas opçoes lá dentro é a tão procurada uuuid-ossp, pronto, é só habilitar essa opção. Depois que dermos um npm run typeorm migration:run no vscode, ele vai criar nossas tabelas. Quando voltarmos para verificarmos se as tabelas foram criadas é importante dar um refresh.

Muito obrigado @AllanFont3s Eu estava com esse mesmo problema e deu certo aqui seguindo sua solução.

heliogbrier commented 3 years ago

@joaopaulu boa dica, resolver memo!!!

dsmanhaes commented 3 years ago

SOLVED Resolvido com a dica do @AllanFont3s

Eu resolvi da seguinte forma: Fui no DBeaver, no banco de dados que eu criei, com o botão direito do mouse em cima do símbolo do Banco de dados existe a opção create, acompanhando as opções que se abrem tem a opção extension, uma das últimas opçoes lá dentro é a tão procurada uuuid-ossp, pronto, é só habilitar essa opção. Depois que dermos um npm run typeorm migration:run no vscode, ele vai criar nossas tabelas. Quando voltarmos para verificarmos se as tabelas foram criadas é importante dar um refresh.

lucasengel commented 3 years ago

Povo, a única solução aceitável aqui é a do @nennogabriel.

Talvez em projetos informais seja aceito usar uma IDE para instalar extensões, mas num time de desenvolvimento de software isso é considerado gambiarra.

douglassantos45 commented 3 years ago

Geralmente esse problema está associado ao @PrimaryGeneratedColumn(), da uma olhada se você setou no decorator o uuid, ex: @PrimaryGeneratedColumn('uuid').

cacpmw commented 3 years ago

Resolvi o problema simplesmente adicionando os decorators nos models

welbertSilva commented 3 years ago

Resolvi tambem da mesma forma que o colega cacpmw. Basta completar as models com os decorators.

edmundobiglia commented 3 years ago

Resolvi o problema simplesmente adicionando os decorators nos models

Também consegui resolver colocando os decorators no model, além de também ter ativado a extensão uuid-ossp.

jonatasoc commented 3 years ago

Eu resolvi da seguinte forma: Fui no DBeaver, no banco de dados que eu criei, com o botão direito do mouse em cima do símbolo do Banco de dados existe a opção create, acompanhando as opções que se abrem tem a opção extension, uma das últimas opçoes lá dentro é a tão procurada uuuid-ossp, pronto, é só habilitar essa opção. Depois que dermos um npm run typeorm migration:run no vscode, ele vai criar nossas tabelas. Quando voltarmos para verificarmos se as tabelas foram criadas é importante dar um refresh.

Resolvido com essa solução! Vlw, rapaz!

jeffersonfelixdev commented 3 years ago

Legal a ideia de resolver o problema inserindo a query na primeira migration, mas acho que isso quebra um pouco da função do TypeORM que é ser o mais abstrato possível, independente de banco de dados. Neste caso a solução mais adequada é habilitar o uuid-ossp manualmente no banco de dados.

hrafaelalves commented 3 years ago

Também consegui resolver esse problema, apenas adicionando os decorators nos models.

dluan commented 3 years ago

Tente adicionar a linha await queryRunner.query(CREATE EXTENSION IF NOT EXISTS "uuid-ossp"); na primeira migration. Isso fará com que o postgres instale o modulo caso ele não tenha.

Boa, resolveu pra mim, obrigado!

allanchrs commented 3 years ago

Tente adicionar a linha await queryRunner.query(CREATE EXTENSION IF NOT EXISTS "uuid-ossp"); na primeira migration. Isso fará com que o postgres instale o modulo caso ele não tenha.

funcionou

rodrigoKulb commented 3 years ago

Show resolvi também adicionando pelo DBeaver adicionando a extensão. Muito obrigado!

manscalh commented 3 years ago

//o meu ficou assim e funcionou....

import { MigrationInterface, QueryRunner, Table } from "typeorm";

export default class CreateTableTransactions1611790430027 implements MigrationInterface {

public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(CREATE EXTENSION IF NOT EXISTS "uuid-ossp"); image

await queryRunner.createTable(
  new Table({
    name: 'transactions',
    columns: [
      {
        name: 'id',
        type: 'uuid',
        isPrimary: true,
        generationStrategy: 'uuid',
        default: 'uuid_generate_v4()'
      },
      {
        name: 'title',
        type: 'varchar'
      },
      {
        name: 'type',
        type: 'varchar',
      },
      {
        name: 'value',
        type: 'decimal',
        precision: 10,
        scale: 2
      },
      {
        name: 'created_at',
        type: 'timestamp',
        default: 'now()',
      },
      {
        name: 'updated_at',
        type: 'timestamp',
        default: 'now()',
      }
    ]
  })
);

}

public async down(queryRunner: QueryRunner): Promise { await queryRunner.dropTable('transactions'); } }

HalissonAlves commented 3 years ago

A dica do @AllanFont3s resolveu por aqui. Muito obrigado.

Eu resolvi da seguinte forma: Fui no DBeaver, no banco de dados que eu criei, com o botão direito do mouse em cima do símbolo do Banco de dados existe a opção create, acompanhando as opções que se abrem tem a opção extension, uma das últimas opçoes lá dentro é a tão procurada uuuid-ossp, pronto, é só habilitar essa opção. Depois que dermos um npm run typeorm migration:run no vscode, ele vai criar nossas tabelas. Quando voltarmos para verificarmos se as tabelas foram criadas é importante dar um refresh.