<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Victor Ferreira Yonemoto - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Victor Ferreira Yonemoto - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 06 May 2026 14:33:11 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/victor-ferreira-yonemoto/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como começar com o Firebase usando Python ]]>
                </title>
                <description>
                    <![CDATA[ Este artigo é um guia detalhado que ajudará você a configurar seu banco de dados do Firebase e a executar operações CRUD simples com ele usando o Python. O Firebase, como você deve saber, é uma plataforma oferecida pelo Google para acelerar o desenvolvimento de aplicações. Ele oferece BaaS, ou ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-comecar-com-o-firebase-usando-python/</link>
                <guid isPermaLink="false">63756c88e2dc4305dbdce98a</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Victor Ferreira Yonemoto ]]>
                </dc:creator>
                <pubDate>Wed, 08 Mar 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/6015593f0a2838549dcbb3b9.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-get-started-with-firebase-using-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Get Started with Firebase Using Python</a>
      </p><p>Este artigo é um guia detalhado que ajudará você a configurar seu banco de dados do Firebase e a executar operações CRUD simples com ele usando o Python.</p><p>O Firebase, como você deve saber, é uma plataforma oferecida pelo Google para acelerar o desenvolvimento de aplicações. Ele oferece BaaS, ou <em>back-end</em> como serviço, o que significa que o Firebase cuida da infraestrutura de nuvem e de todas as suas necessidades de <em>back-end</em>. Isso permite desenvolver e implementar mais rapidamente.</p><p>O Firebase oferece vários produtos incríveis, como o Realtime Database (banco de dados em tempo real), a Cloud Firestore (nuvem Firestore) e Authentication (autenticação). Também permite hospedagem e oferece APIs para tarefas de aprendizagem de máquina, como reconhecimento de texto, rotulagem de imagens e muito mais!</p><p>Vá até o <a href="https://firebase.google.com/">site deles</a> e se encante com as opções disponíveis.</p><h2 id="como-configurar-o-realtime-database-do-firebase">Como configurar o Realtime Database do Firebase</h2><p>Crie um projeto no Firebase – vamos chamá-lo de BookStoreProject (projeto de loja de livros). Depois de configurado, crie um Realtime Database selecionando a opção Create Database (criar banco de dados).</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/pic-1.png" class="kg-image" alt="pic-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/pic-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/03/pic-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/pic-1.png 1065w" width="1065" height="618" loading="lazy"><figcaption>Criação de um Realtime Database com o console do Firebase</figcaption></figure><p>Ao clicar em <em>Create Database</em>, você deve especificar a localização do banco de dados e as regras de segurança. Duas regras estão disponíveis:</p><ul><li>locked mode (modo bloqueado), que nega todas leituras e gravações no banco de dados e</li><li>test mode (modo de teste), que permite acesso de leitura e gravação por um período padrão de 30 dias (após o qual todas as leituras e gravações são negadas, a menos que as regras de segurança sejam atualizadas).</li></ul><p>Como usaremos o banco de dados para leitura, gravação e edição escolheremos o test mode. Feito isso, o banco de dados está pronto para o nosso uso!</p><h2 id="como-gravar-no-firebase-realtime-database-usando-python">Como gravar no Firebase Realtime Database usando Python</h2><p>O próximo passo é descobrir como podemos nos conectar com o nosso banco de dados usando Python. Vamos usar a API Admin Database. Você precisará instalar a biblioteca necessária.</p><p>Para obter mais informações sobre como usar o <code>firebase_admin</code> para Python, confira a documentação oficial <a href="https://firebase.google.com/docs/database/admin/start">aqui</a> (documentação em inglês).</p><pre><code class="language-python">pip install firebase_admin</code></pre><p>Para se conectar ao Firebase, precisamos das seguintes linhas de código:</p><pre><code>import firebase_admin

cred_obj = firebase_admin.credentials.Certificate('....path to file')
default_app = firebase_admin.initialize_app(cred_object, {
	'databaseURL':databaseURL
	})</code></pre><p>No entanto, para fazer o código funcionar precisamos de alguns pré-requisitos.</p><p>Primeiro, precisamos especificar o caminho para uma chave de conta de serviço (em inglês, <em>Service Account Key</em>), que será usada para inicializar o admin SDK.</p><p>O Firebase permitirá o acesso às APIs do servidor Firebase a partir das contas de serviço do Google. Para autenticar a conta de serviço, é necessária uma chave privada no formato JSON.</p><p>O caminho para esse arquivo JSON deve ser fornecido para criar o objeto de credenciais. Para gerar a chave, vá até as configurações do projeto (<em>Project Settings</em>, em inglês), clique em gerar nova chave privada (<em>Generate new private key</em>, em inglês), baixe o arquivo e coloque-o em sua estrutura de diretórios.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/image-205.png" class="kg-image" alt="image-205" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/image-205.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/03/image-205.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/image-205.png 1141w" width="1141" height="184" loading="lazy"><figcaption>Project Settings no console do Firebase</figcaption></figure><p>Para um explicação mais detalhada sobre esse processo, consulte a documentação oficial <a href="https://firebase.google.com/docs/admin/setup">aqui</a> (documentação em inglês).</p><p>Em seguida, precisamos de databaseURL, que é simplesmente o URL que dá acesso ao nosso banco de dados. Ele está presente na própria página do Realtime Database no console do Firebase.</p><h3 id="como-gravar-usando-a-fun-o-set-">Como gravar usando a função set()</h3><pre><code>from firebase_admin import db

ref = db.reference("/")</code></pre><p>Definimos a referência para a <em>root </em>(raiz) do banco de dados (ou também podemos defini-la como um par chave-valor, ou como um par chave-valor filho). A pergunta que surge naturalmente é: qual esquema é permitido para armazenar dados em banco de dados de tempo real?</p><p>Todos os dados a serem armazenados devem estar no formato JSON, ou seja, uma sequência de pares chave-valor. Se você precisar de uma chave gerada pelo sistema, poderá optar por usar a função <code>push()</code>, que abordaremos em breve.</p><p>Vamos criar um JSON adequado que pode ser salvo no banco de dados. Temos informações sobre quatro livros da seguinte maneira:</p><pre><code class="language-json">{
	"Book1":
	{
		"Title": "The Fellowship of the Ring",
		"Author": "J.R.R. Tolkien",
		"Genre": "Epic fantasy",
		"Price": 100
	},
	"Book2":
	{
		"Title": "The Two Towers",
		"Author": "J.R.R. Tolkien",
		"Genre": "Epic fantasy",
		"Price": 100	
	},
	"Book3":
	{
		"Title": "The Return of the King",
		"Author": "J.R.R. Tolkien",
		"Genre": "Epic fantasy",
		"Price": 100
	},
	"Book4":
	{
		"Title": "Brida",
		"Author": "Paulo Coelho",
		"Genre": "Fiction",
		"Price": 100
	}
}</code></pre><p>Carregamos o arquivo JSON necessário e salvamos os dados no banco de dados assim:</p><pre><code>import json
with open("book_info.json", "r") as f:
	file_contents = json.load(f)
ref.set(file_contents)</code></pre><p>O banco de dados agora tem esta aparência:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/image-207.png" class="kg-image" alt="image-207" width="369" height="259" loading="lazy"><figcaption>Esquema do banco de dados, visto a partir do console do Firebase</figcaption></figure><h3 id="como-gravar-usando-a-fun-o-push-">Como gravar usando a função push()</h3><p>O Firebase nos fornece a função <code>push()</code>, que salva dados em uma chave única gerada pelo sistema. Esse método garante que, se várias gravações estiverem sendo executadas na mesma chave, elas não serão substituídas.</p><p>Por exemplo, se várias fontes tentarem fazer uma gravação em <code>/Books/Best_Sellers/</code>, então qualquer que seja a fonte que fizer a ultima gravação, esse valor persistirá no banco de dados. Isso introduz a possibilidade de dados serem sobrescritos. <code>push()</code> resolve esse problema usando chaves exclusivas para cada novo "filho" adicionado.</p><pre><code>ref = db.reference("/")
ref.set({
	"Books":
	{
		"Best_Sellers": -1
	}
})

ref = db.reference("/Books/Best_Sellers")
import json
with open("book_info.json", "r") as f:
	file_contents = json.load(f)

for key, value in file_contents.items():
	ref.push().set(value)</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/image-208.png" class="kg-image" alt="image-208" width="421" height="301" loading="lazy"><figcaption>Esquema do banco de dados após a execução do método push()</figcaption></figure><p>Observe que <code>push()</code> e <code>set()</code> não são atômicos. Isso significa que não há garantia que ambas as funções serão executadas juntas sem interrupção como uma única unidade indivisível.</p><p>Enquanto o banco de dados está sendo atualizado, se tentarmos buscar os dados, pode acontecer que <code>push()</code> tenha terminado, mas <code>set()</code> ainda não. Então, o JSON que recebemos terá uma chave gerada pelo sistema sem um campo de valor.</p><h2 id="como-atualizar-seu-banco-de-dados-do-firebase-com-python">Como atualizar seu banco de dados do Firebase com Python</h2><p>Atualizar o banco de dados é tão simples quanto definir a referência no ponto necessário e usar a função <code>update()</code>. Digamos que o preço dos livros de J. R. R. Tolkien seja reduzido para 80 para oferecer um desconto.</p><pre><code>ref = db.reference("/Books/Best_Sellers/")
best_sellers = ref.get()
print(best_sellers)
for key, value in best_sellers.items():
	if(value["Author"] == "J.R.R. Tolkien"):
		value["Price"] = 90
		ref.child(key).update({"Price":80})
        
        </code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/image-209.png" class="kg-image" alt="image-209" width="416" height="301" loading="lazy"><figcaption>Esquema do banco de dados após o uso da função update()</figcaption></figure><h2 id="como-recuperar-dados-do-firebase-usando-python">Como recuperar dados do Firebase usando Python</h2><p>Já recuperamos dados usando o método <code>get()</code> quando tentamos atualizar uma chave específica. Agora, veremos mais alguns métodos e agrupamentos para fazer consultas mais complexas.</p><p>Vamos colocar todos os livros em ordem, classificando-os por preço usando o método <code>order_by_child()</code>. Para aplicar esse método, primeiramente, temos que definir a chave pela qual estamos ordenando como o campo de índice por meio da regra <code>.indexOn</code> nas regras de segurança do Firebase.</p><p>Se quisermos classificar por preço, o preço deve ser listado como índice. Você pode definir o valor assim:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/image-210.png" class="kg-image" alt="image-210" width="266" height="147" loading="lazy"><figcaption>Vá para a aba Rules (regras) e insira a estrutura do esquema na qual você deseja definir o índice</figcaption></figure><pre><code>ref = db.reference("/Books/Best_Sellers/")
print(ref.order_by_child("Price").get())</code></pre><p>O valor de retorno do método é um OrderedDict. Para ordenar por chave, use <code>order_by_key()</code>. Para obter o livro com o maior preço, utilizamos o método <code>limit_to_last()</code>, da seguinte maneira:</p><pre><code>ref.order_by_child("Price").limit_to_last(1).get()</code></pre><p>Como alternativa, para obter o livro com menor preço, escrevemos:</p><pre><code>ref.order_by_child("Price").limit_to_first(1).get()</code></pre><p>Para obter livros com preço igual a 80, usamos:</p><pre><code>ref.order_by_child("Price").equal_to(80).get()</code></pre><p>Para mais exemplos e métodos de consulta do banco de dados de acordo com seus requisitos, confira a documentação oficial <a href="https://firebase.google.com/docs/database/admin/retrieve-data">aqui</a> (documentação em inglês).</p><h2 id="como-excluir-dados-do-firebase-usando-python">Como excluir dados do Firebase usando Python</h2><p>Excluir dados é bem simples. Vamos excluir todos os livros mais vendidos que tenham J.R.R Tolkien como autor.</p><pre><code>ref = db.reference("/Books/Best_Sellers")

for key, value in best_sellers.items():
	if(value["Author"] == "J.R.R. Tolkien"):
		ref.child(key).set({})
        
        </code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/image-211.png" class="kg-image" alt="image-211" width="368" height="219" loading="lazy"><figcaption>Esquema do banco de dados após a exclusão</figcaption></figure><h2 id="conclus-o">Conclusão</h2><p>Neste artigo, aprendemos como criar um banco de dados usando o Realtime Database do Firebase, como preenchê-lo com dados, excluir, atualizar e consultar os dados usando Python.</p><p>Espero poder ter ajudado os desenvolvedores em Python que acabaram de descobrir a utilidade do Firebase, mas que também estão se sentindo sobrecarregados com tantas opções e métodos diferentes para escolher. Se você leu até aqui, muito obrigada! Cuide-se e divirta-se programando!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como atualizar objetos dentro de um array JSONB com PostgreSQL ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Leandro Cesquini Pereira Como atualizar um valor específico em um array JSONB Digamos que você decidiu armazenar dados em um banco de dados como json ou jsonb e descobriu que acaba de criar novos problemas para si mesmo que antes não existiam. Você não está sozinho. O JSONB ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-atualizar-objetos-dentro-de-um-array-jsonb-com-postgresql/</link>
                <guid isPermaLink="false">6351e66f191d0905ea418a97</guid>
                
                    <category>
                        <![CDATA[ Tecnologia ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Victor Ferreira Yonemoto ]]>
                </dc:creator>
                <pubDate>Mon, 26 Dec 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/0_TyYEPUBI96D1NDh4.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-update-objects-inside-jsonb-arrays-with-postgresql-5c4e03be256a/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to update objects inside JSONB arrays with PostgreSQL</a>
      </p><p>Escrito por: Leandro Cesquini Pereira</p><h3 id="como-atualizar-um-valor-espec-fico-em-um-array-jsonb">Como atualizar um valor específico em um array JSONB</h3><p>Digamos que você decidiu armazenar dados em um banco de dados como json ou jsonb e descobriu que acaba de criar novos problemas para si mesmo que antes não existiam. Você não está sozinho.</p><p>O JSONB é uma ferramenta poderosa, mas tem um custo, pois você precisa adaptar a maneira como faz consultas (em inglês, <em>queries</em>) e manipula os dados.</p><p>Não é raro carregar todo o objeto JSONB na memória, transformá-lo usando sua linguagem de programação preferida e salvar o objeto novamente no banco de dados. Você, no entanto, acaba de criar um problema de gargalos de desempenho e desperdício de recursos.</p><p>Neste artigo, vamos ver como atualizar um valor específico de um objeto dentro de um array com uma consulta.</p><p><strong>Versão resumida</strong>: a query final está no fim do artigo. Você pode conferir um exemplo no <a href="https://www.db-fiddle.com/f/e8aeGk7cRNYnpjsqi1ncrs/1" rel="noopener">DB Fiddle</a> para copiar, colar e testar por sua conta.</p><p>Suponha que você esteja implementando tela de clientes o armazenamento de contatos dinâmicos para cada cliente. Então, você tem a ideia de armazenar os contatos em uma coluna em JSONB, pois eles são dinâmicos. Assim, usar uma estrutura de dados não relacional faz sentido.</p><p>Em seguida, você cria uma tabela de clientes com uma coluna de contatos em JSONB e insere alguns dados nela:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/gfE87Cd6J1Jg8NG-SoiqfVGz1J8JN8rC6Fnj.png" class="kg-image" alt="gfE87Cd6J1Jg8NG-SoiqfVGz1J8JN8rC6Fnj" width="521" height="352" loading="lazy"></figure><p>Bem fácil, não é? Como, no entanto, podemos atualizar um contato específico para um cliente específico? Como mudar o e-mail de Jimi ou o telefone de Janis, por exemplo?</p><p>Felizmente, o PostgreSQL é seu amigo e fornece a função <em>jsonb_set</em>:</p><pre><code>jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])</code></pre><p>Dada uma coluna de jsonb, você pode definir um novo valor no caminho especificado:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/NsMb3UL3fPutaYFB4ebdOGq7rFVCqjJmiJPd.png" class="kg-image" alt="NsMb3UL3fPutaYFB4ebdOGq7rFVCqjJmiJPd" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/NsMb3UL3fPutaYFB4ebdOGq7rFVCqjJmiJPd.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/NsMb3UL3fPutaYFB4ebdOGq7rFVCqjJmiJPd.png 800w" sizes="(min-width: 720px) 720px" width="800" height="262" loading="lazy"><figcaption>Referência: <a href="https://www.postgresql.org/docs/9.5/functions-json.html" rel="noopener">funções de JSON do PostgreSQL</a></figcaption></figure><p>Os selects (seleções) acima retornarão:</p><pre><code>[{"type": "phone", "value": "+1–202–555–0105"}, {"type": "email", "value": "jimi.hendrix@gmail.com"}]

[{"type": "email", "value": "janis.joplin@gmail.com"}]</code></pre><p>Para alterar o e-mail de Jimi na lista de contatos, informe o caminho "<strong>1, value</strong>",<strong> </strong>que significa o segundo objeto do array (começando em 0) e a chave <strong>value </strong>(valor). Esse é o <em>path (caminho)</em>. O mesmo se aplica para alterar o e-mail de Janis, mas seu objeto de e-mail está no índice 0.</p><p>Você deve estar pensando: eu só preciso usar <code>jsonb_set</code> em um <em>statement</em> (instrução) de atualização e pronto? Essa é a ideia, mas ainda não é o suficiente.</p><p>O problema com dados não relacionais é que eles são dinâmicos. Bem, esse é um dos motivos para se usar JSONB, mas gera um problema: veja que o objeto de e-mail de Jimi está no índice 1 e o objeto de e-mail de Janis está no índice 0 do array. Outro cliente poderia ter um array muito diferente com índices diferentes. Então, como descobrir o índice de cada tipo de contato?</p><p>A resposta é ordenar os elementos do array e obter seu índice:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/KoTlVXRd73a57XhyrIfVj0QnZfqRK8KguWoZ.png" class="kg-image" alt="KoTlVXRd73a57XhyrIfVj0QnZfqRK8KguWoZ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/KoTlVXRd73a57XhyrIfVj0QnZfqRK8KguWoZ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/KoTlVXRd73a57XhyrIfVj0QnZfqRK8KguWoZ.png 754w" sizes="(min-width: 720px) 720px" width="754" height="133" loading="lazy"></figure><p>A query retorna <strong>1</strong>, que é o <em>índice</em> do objeto <em>email </em>(de tipo <em>email</em>) dentro do array de contatos do cliente Jimi.</p><p>Agora, temos todas as peças do quebra-cabeça: sabemos como atualizar um valor em jsonb e como descobrir o índice de um objeto a ser atualizado.</p><p>O único passo que resta é a própria atualização. Juntando tudo, temos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/ysGG240RTX8t9rLeuMv4KdubaDVpzVMfjnEb.png" class="kg-image" alt="ysGG240RTX8t9rLeuMv4KdubaDVpzVMfjnEb" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/ysGG240RTX8t9rLeuMv4KdubaDVpzVMfjnEb.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/ysGG240RTX8t9rLeuMv4KdubaDVpzVMfjnEb.png 800w" sizes="(min-width: 720px) 720px" width="800" height="235" loading="lazy"></figure><p>A parte mais importante dessa query é o bloco <em>with</em>. É um recurso poderoso, mas, para este exemplo, você pode pensar nele como um "modo de armazenar uma variável", que é o <em>path(caminho)</em> do contato que é necessário atualizar, o qual será dinâmico, dependendo do registro.</p><p>Deixe-me explicar um pouco sobre esta parte:</p><pre><code>(‘{‘||index-1||’,value}’)::text[] as path</code></pre><p>Essa parte apenas constrói <em>path </em>como <em>'{1, value}'</em>, mas precisamos converter para <em>text[]</em>, pois esse é o tipo esperado em uma função <em>jsonb_path</em>.</p><h4 id="resumindo">Resumindo</h4><p>O JSONB é uma ferramenta excelente e valiosa para resolver muitos problemas. Tenha em mente, porém, que você também precisa consultar e atualizar esse tipo de dado. Isso traz um custo que você deve considerar ao decidir quais ferramentas escolher para usar.</p><p><em>Observação: essa solução surgiu de uma sessão de programação com <a href="https://www.freecodecamp.org/news/how-to-update-objects-inside-jsonb-arrays-with-postgresql-5c4e03be256a/undefined" rel="noopener">Lucas Cegatti</a>.</em></p><p><em>Está procurando por uma empresa criativa para implementar sua próxima ideia? Confira a <a href="https://lnasystems.com.br" rel="noopener">LNA Systems</a>.</em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como escrever uma Promise em Javascript ]]>
                </title>
                <description>
                    <![CDATA[ O que é uma promise ? Uma promise em Javascript é um objeto que representa a conclusão ou o fracasso de uma tarefa assíncrona e seu valor resultante.¹ Fim. Estou brincando, é claro. Então, o que essa definição significa? Primeiramente, muitas coisas em Javascript são objetos. É possível criar um ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-escrever-uma-promise-em-javascript/</link>
                <guid isPermaLink="false">63471e7e287f9a05e0d4d464</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Victor Ferreira Yonemoto ]]>
                </dc:creator>
                <pubDate>Thu, 24 Nov 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_RR8oubeQOm63YN90Uth0CA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-write-a-javascript-promise-4ed8d44292b8/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Write a JavaScript Promise</a>
      </p><h3 id="o-que-uma-promise">O que é uma promise ?</h3><p>Uma <em>promise</em> em Javascript é um objeto que representa a conclusão ou o fracasso de uma tarefa assíncrona e seu valor resultante.¹</p><p>Fim.</p><p>Estou brincando, é claro. Então, o que essa definição significa?</p><p>Primeiramente, muitas coisas em Javascript são objetos. É possível criar um objeto de maneiras diferentes. A maneira mais comum é com a sintaxe literal de objeto:</p><pre><code class="language-js">const myCar = {
   color: 'blue',
   type: 'sedan',
   doors: '4',
};</code></pre><p>Você pode também criar uma <code>class</code> (classe) e instanciá-la com a palavra chave <code>new</code> (nova).</p><pre><code class="language-js">class Car {
   constructor(color, type, doors) {
      this.color = color;
      this.type = type;
      this.doors = doors
   }
}

const myCar = new Car('blue', 'sedan', '4');</code></pre><p><code>console.log(myCar);</code></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_QUB10cb7QMBVBEGM2JRo1g.png" class="kg-image" alt="1_QUB10cb7QMBVBEGM2JRo1g" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/1_QUB10cb7QMBVBEGM2JRo1g.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_QUB10cb7QMBVBEGM2JRo1g.png 636w" width="636" height="166" loading="lazy"></figure><p>Uma <em>promise</em> é, simplesmente, um objeto que criamos, como no exemplo posterior. Nós a instanciamos com a palavra chave <code>new</code>. Em vez dos três parâmetros que passamos para fazer nosso carro (color - cor, type - tipo, doors - portas), nós passamos uma função que recebe dois argumentos: <code>resolve</code> (resolver) e <code>reject</code> (rejeitar).</p><p>No fim, <em>promises</em> nos dizem algo sobre a conclusão da função assíncrona da qual a retornamos – se deu certo ou não. Dizemos que a função foi bem-sucedida se a promise <em>resolved (foi resolvida)</em> e que não foi bem-sucedida se a promise <em>rejected (foi rejeitada).</em></p><pre><code class="language-js">const myPromise = new Promise(function(resolve, reject) {});</code></pre><p><code>console.log(myPromise);</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_z8UFY0q1iVmr4xzOqOvFlA.png" class="kg-image" alt="1_z8UFY0q1iVmr4xzOqOvFlA" width="518" height="140" loading="lazy"><figcaption>Observe que o status da promise é “pending” (pendente).</figcaption></figure><pre><code class="language-js">const myPromise = new Promise(function(resolve, reject) {
   resolve(10);
});</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_voamRd9sJg_NZ0vOdbYJgg.png" class="kg-image" alt="1_voamRd9sJg_NZ0vOdbYJgg" width="516" height="134" loading="lazy"><figcaption>Observe que resolvemos a promise com o valor 10.</figcaption></figure><p>Veja, nada muito assustador – apenas um objeto que criamos. Se nós o expandirmos um pouco:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_szpVAwKfKzMasjP9Wlpigg.png" class="kg-image" alt="1_szpVAwKfKzMasjP9Wlpigg" width="596" height="320" loading="lazy"><figcaption>Observe que temos alguns métodos que temos acesso “then” e “catch”</figcaption></figure><p>Além disso, podemos passar qualquer coisa que queiramos para resolver e rejeitar. Por exemplo, poderíamos passar um objeto em vez de uma string:</p><pre><code class="language-js">return new Promise((resolve, reject) =&gt; {
   if(somethingSuccesfulHappened) {
      const successObject = {
         msg: 'Success',
         data,//...alguns dados que recebemos
      }
      resolve(successObject); 
   } else {
      const errorObject = {
         msg: 'An error occured',
         error, //...algum erro recebido
      }
      reject(errorObject);
   }
});</code></pre><p>Ou, como vimos anteriormente, não precisamos passar nada:</p><pre><code class="language-js">return new Promise((resolve, reject) =&gt; {
   if(somethingSuccesfulHappend) {
      resolve()
   } else {
      reject();
   }
});</code></pre><h4 id="e-quanto-parte-ass-ncrona-da-defini-o">E quanto à parte “assíncrona” da definição?</h4><p>JavaScript opera a partir de uma única <em>thread</em>. Isso significa que consegue executar apenas uma coisa de cada vez. Imagine uma estrada. Você pode pensar em JavaScript como uma rodovia de pista única. Certos códigos (código assíncrono) podem ceder lugar permitindo que outra parte do código o passe (seja executado primeiro). Quando esse código assíncrono termina sua tarefa, ele retorna à estrada.</p><blockquote>Como observação, <em>podemos retornar uma </em>promise <em>a partir de qualquer função</em>. Não há necessidade de ser assíncrona. Dito isso, promises geralmente são retornadas nos casos em que a função da qual retornam é assíncrona. Por exemplo, uma API que possui métodos para salvar dados em um servidor seria uma ótima candidata para retornar uma promise!</blockquote><p><strong>Concluindo:</strong></p><p><em>Promises </em>nos dão uma maneira de aguardar que o nosso código assíncrono seja concluído, capturemos valores a partir disso e passemos esses valores a outras partes do nosso programa.</p><p><em>Eu tenho um artigo aqui que se aprofunda nesses conceitos: <a href="https://www.freecodecamp.org/news/thrown-for-a-loop-understanding-for-loops-and-timeouts-in-javascript-558d8255d8a4/">Thrown For a Loop: Understanding Loops and Timeouts in JavaScript</a> </em>(texto em inglês)<em>.</em></p><h3 id="como-usamos-uma-promise">Como usamos uma <em>promise</em>?</h3><p>Usar uma <em>promise </em>também é chamado de <em>consumir</em> uma <em>promise</em>. No nosso exemplo acima, nossa função retornou um objeto <em>promise</em>. Isso nos permite usar o encadeamento de métodos com nossa função.</p><p>Aqui está um exemplo de encadeamento de métodos que eu aposto que você já viu:</p><pre><code class="language-js">const a = 'Some awesome string';
const b = a.toUpperCase().replace('ST', '').toLowerCase();

console.log(b); // some awesome ring</code></pre><p>Agora, chamamos nossa <em>promise </em>(fictícia):</p><pre><code class="language-js">const somethingWasSuccesful = true;

function someAsynFunction() {
   return new Promise((resolve, reject){
      if (somethingWasSuccesful) {
         resolve();     
      } else {
         reject()
      }
   });
}</code></pre><p>Consumindo nossa <em>promise </em>usando encadeamento de métodos, temos:</p><pre><code class="language-js">someAsyncFunction
   .then(runAFunctionIfItResolved(withTheResolvedValue))
   .catch(orARunAfunctionIfItRejected(withTheRejectedValue));</code></pre><h3 id="um-exemplo-mais-real">Um exemplo (mais) real</h3><p>Imagine que você tem uma função que obtém usuários de um banco de dados. Escrevi uma função de exemplo no CodePen, que simula uma API que você pode usar. Ela fornece duas opções para acessar os resultados. Primeiro, você pode prover uma função de callback onde você pode acessar o usuário ou qualquer erro. Em segundo, a função retorna uma <em>promise </em>como forma de acessar o usuário ou o erro.</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_NoNMgJ" src="https://codepen.io/brandonwoz/embed/preview/NoNMgJ?default-tabs=js%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=NoNMgJ" title="Simulated User Database" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;" loading="lazy"></iframe></figure><p>Tradicionalmente, acessamos os resultados do código assíncrono através do uso de callbacks.</p><pre><code class="language-js">rr someDatabaseThing(maybeAnID, function(err, result)) {
   //...Depois que obtemos o que vamos buscar no banco de dados...
   if(err) {
      doSomethingWithTheError(error)
   }   else {
      doSomethingWithResults(results);
   }
}</code></pre><p>O uso de callbacks é <em>aceitável</em> até que eles se tornem excessivamente aninhados. Em outras palavras, você precisa executar mais código assíncrono a cada novo resultado. Esse padrão de <em>callbacks</em> dentro de <em>callbacks</em> pode levar a algo conhecido como "<em>callback hell</em>" (inferno das callbacks).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_DxEgvtymVuqpLOSx8NJ57A.png" class="kg-image" alt="1_DxEgvtymVuqpLOSx8NJ57A" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/1_DxEgvtymVuqpLOSx8NJ57A.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_DxEgvtymVuqpLOSx8NJ57A.png 800w" sizes="(min-width: 720px) 720px" width="800" height="312" loading="lazy"><figcaption>O início do callback hell</figcaption></figure><p><em>Promises </em>nos oferecem uma maneira mais elegante e legível de ver o fluxo do nosso programa.</p><pre><code class="language-js">doSomething()
   .then(doSomethingElse) // e se você não se importar
   .catch(anyErrorsPlease);</code></pre><h3 id="escrevendo-nossa-promise-cachinhos-dourados-os-tr-s-ursos-e-um-supercomputador">Escrevendo nossa <em>promise</em>: Cachinhos Dourados, os três ursos e um supercomputador</h3><p>Imagine que você encontrou uma tigela de sopa. Você gostaria de saber a temperatura da sopa antes de comê-la. Porém, você está sem termômetros. Felizmente, você possui acesso a um supercomputador capaz de dizer a temperatura da tigela de sopa. Infelizmente, esse supercomputador pode levar até 10 segundos para obter os resultados.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_XtBW084Eg2feXeR97W2yvw.png" class="kg-image" alt="1_XtBW084Eg2feXeR97W2yvw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/1_XtBW084Eg2feXeR97W2yvw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_XtBW084Eg2feXeR97W2yvw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="405" loading="lazy"></figure><p>Algumas coisas para observarmos.</p><ol><li>Iniciamos a variável global chamada <code>result</code>.</li><li>Simulamos a duração do delay (atraso) da rede com &nbsp;<code>Math.random()</code> e <code>setTimeout()</code>.</li><li>Simulamos a temperatura com <code>Math.random()</code>.</li><li>Mantemos os valores de delay e de temperatura confinados dentro de um range (intervalo) adicionando "matemática" extra. O range para <code>temp</code> é de 1 a 300; o range para o <code>delay</code> é 1000ms a 10000ms (1 a 10 segundos).</li><li>Registramos o delay e a temperatura para ter uma ideia de quanto tempo essa função levará e os resultados que esperamos ver quando estiver concluída.</li></ol><p>Execute a função e registre os resultados.</p><pre><code class="language-js">getTemperature(); 
console.log(results); // undefined</code></pre><h4 id="a-temperatura-undefined-indefinida-o-que-aconteceu">A temperatura é undefined (indefinida). O que aconteceu?</h4><p>A função levará um certo tempo para ser executada . A variável não é definida até que o delay acabe. Então, enquanto executamos a função, <code>setTimeout</code> é assíncrona. A parte do código em <code>setTimeout</code> sai do thread principal para uma área de espera.</p><p><em>Tenho um artigo aqui que se aprofunda nesse processo: <a href="https://www.freecodecamp.org/news/thrown-for-a-loop-understanding-for-loops-and-timeouts-in-javascript-558d8255d8a4/">Thrown For a Loop: Understanding Loops and Timeouts in JavaScript</a> </em>(texto em inglês)<em>.</em></p><p>Como a parte da nossa função que define a variável <code>result</code> se move para uma área de espera até que seja concluída, nosso analisador está livre para passar para a próxima linha. No nosso caso, é nosso <code>console.log()</code>. Nele, <code>result</code> ainda é <code>undefined</code> pois, nosso <code>setTimeout</code> não acabou.</p><p>Então, o que mais poderíamos tentar ? Poderíamos executar <code>getTemperature()</code> e aguardar 11 segundos (já que o nosso delay máximo e de 10 segundos) e <em>then (então)</em> fazer o console.log dos resultados.</p><pre><code class="language-js">getTemperature();
   setTimeout(() =&gt; {
      console.log(result); 
   }, 11000);
   
// Muito quente | Delay: 3323 | Temperatura: 209 graus</code></pre><p>Isso funciona, mas o problema com essa técnica é que, embora em nosso exemplo saibamos o delay máximo da rede, em um exemplo da vida real, pode levar ocasionalmente mais de 10 segundos. Mesmo que pudéssemos garantir um delay máximo de 10 segundos, se o resultado ficar pronto antes, haverá um desperdício de tempo.</p><h3 id="as-promises-salvam-o-dia">As promises salvam o dia</h3><p>Vamos refatorar nossa função <code>getTemperature()</code> para retornar uma <em>promise</em>. Em vez de definir o resultado, rejeitaremos a <em>promise </em>a menos que o resultado seja "na medida", caso em que resolveremos a <em>promise</em>. Em ambos os casos, passaremos alguns valores para resolver e rejeitar.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_4RJERRgVUtHlIYRFm2piVQ.png" class="kg-image" alt="1_4RJERRgVUtHlIYRFm2piVQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/1_4RJERRgVUtHlIYRFm2piVQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/1_4RJERRgVUtHlIYRFm2piVQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="432" loading="lazy"></figure><p>Agora, podemos usar os resultados da nossa <em>promise </em>que estamos retornando (também chamado de <em>consumir</em> a <em>promise</em>).</p><pre><code class="language-js">getTemperature()
   .then(result =&gt; console.log(result))
   .catch(error =&gt; console.log(error));
   
// Rejeitar: muito fria | Delay: 7880 | Temperatura: 43 graus</code></pre><p><code>.then</code> será chamado quando nossa <em>promise </em>for resolvida e retornará qualquer informação que passamos para o <code>resolve</code>.</p><p><code>.catch</code> será chamado quando nossa <em>promise </em>for rejeitada e retornará qualquer informação que passamos para o <code>reject</code>.</p><p>Muito provavelmente, você consumirá mais <em>promises </em>do que as criará. Em ambos os casos, elas ajudam a tornar o código mais elegante, legível e eficiente.</p><h3 id="resumo">Resumo</h3><ol><li><em>Promises </em>são objetos que contém informações sobre a conclusão de algum código assíncrono e quaisquer valores resultantes que queremos passar.</li><li>Para retornar uma <em>promise </em>usamos <code>return new Promise((resolve, reject)=&gt; {})</code></li><li>Para consumir uma <em>promise </em>usamos <code>.then</code>, para obter as informações de uma <em>promise </em>que foi resolvida, e <code>.catch</code>, para obter as informações de uma <em>promise </em>que foi rejeitada.</li><li>Você provavelmente usará (consumirá) <em>promises </em>mais do que as escreverá.</li></ol><h4 id="refer-ncias">Referências</h4><ol><li> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise" rel="noopener"><em></em></a><em><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise">https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise</a></em></li></ol> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
