Olá pessoas boas-vindas a mais uma aula do nosso curso de Fashion IPI Nossa quarta aula boas-vindas espero que vocês sintam-se em casa esperando aquele feedback básico de vocês assim se o áudio tá legal se o vídeo tá rolando E aí a gente começa de fato no assunto hoje a gente vai conversar um pouco sobre bancos de dados gerenciamento de migrações SQL alkem Alem que são muitas coisinhas muitas sigl inhas muitos nominhos mas eu espero que vocês Se divirtam junto comigo conversando sobre esses assuntos maravilhosos queria dizer que eu arrumei os emojis Então agora eu posso
destacar os emojis Então vamos lá para quem precisar ver essa aula em texto ela tá lá também aula 4 links na descrição e e tudo mais então Se alguém quiser precisar disso tem aqui quiser ver os códigos Fontes As Coisas d uma conversada e tudo mais o olel mandou Já tome esse like aí não esqueçam de deixar o like agora no começo da aula por favor e então vamos lá sobre o que que a gente vai conversar um pouco nessa aula eu quero dar para vocês uma introdução a duas ferramentas na verdade a gente vai
ver três coisinhas novas nessa aula mas eu quero focar em duas específicas uma delas é o SQL alkemy e a outra é o alembic o SQL alkem é basicamente uma biblioteca que faz automações de coisas de bancos de dados então ah como fazer buscas no banco deletar banco criar banco criar tabela sobe tabela altera dados ele ele tem essa responsabilidade e o alenic é uma ferramenta pra gente gerar escopos de migrações de de skim mas acho que a melhor é a melhor forma de dizer é sobre isso então a gente vai instalar essas duas ferramentas
a gente vai criar nossa primeira tabela no banco de dados que é aquela história de gerenciar o user que a gente gerou aquele banco de dados fake que é uma lista em memória a gente vai testar isso aqui porque sim testes é sensacional E aí a gente vai falar sobre o esquema de migrações e tudo mais bom no começo eu eu queria dar uma introdução ao SQL alkem bem básica bem rápida e eu deixei lição de casa na aula passada pra gente conversar para vocês assistirem uma aula que eu falei sobre skl Alem mais a
fundo e tem muito mais funcionalidades muito mais cois foi uma live de Du horas focada só em skl alkemy então eu deixi isso na aula recomendado lá na aula TRS né no último slide da aula 3 para quem não viu ainda recomendo que dê uma olhada nessa aula aqui nessa Live 252 eu acho super 258 eu acho super importante não sei se todo mundo viu mas mesmo assim depois dessa aula Eu ainda acho que é importante dar uma olhada nessa outra Live aqui porque funciona muito mais então vamos lá o skl alkem é um ORM
Na verdade ele não é um ORM eu tentei simplificar o máximo ele tem um ORM um ORM está contido dentro dele ele pode fazer várias outras coisas mas a ideia principal dele é que você consiga trabalhar com banco de dados SQL né E aí pode ser qualquer banco Ah o postes skl o ma skl o Maria DB cock root DB ã sqlite tem o skl server e todas essas coisas então ele é uma camada grande de abstração para que você consiga trabalhar com n banco de dados que são relacionais ou SQL ou sequel para quem
preferir então A ideia é essa E aí ele vai fazer isso aqui trazendo a gente para um contexto de Python ou seja em vez de ter que usar SQL que é a linguagem padrão né é não não existe um SQL de verdade assim né a gente tem várias coas coisas que a gente simula e que são parecidas na sintaxe entre um banco e outro e tudo mais obrigado Diogo ó um beijo para você Valeu e Carlos também valeu também pelo pelo super chats então a ideia principal aqui que a gente tem é que a gente
consiga Trazer isso para não ter que trabalhar com o SQL nessa camada do do próprio Python Então a gente vai montar buscas relacionamentos criação de tabelas e todos esses esquemas que envolvem SQL dentro do SQL Alem e além de tudo dentro dessas todas essas milhares de ferramentas de automação que o skl Alem tem uma delas é o ORM e o RM é uma sigla meio esquisita que significa mapeamento de objeto relacional por relacional entenda que um banco de dados é uma coisa que contém relações né a gente cri Vas tabas E essas tabas se relacion
então A ideia é trazer esses relacionamentos do SQL em vez de tratar na linguagem crua do SQL a gente vai tratar ISO com python e objeto então quer dizer objeto relacional porque a gente vai fazer isso usando objetos do Python classes do Python cada modelinho a gente vai criar classe do Python para poder fazer esse tipo de coisa e o mapeamento ele traz essas duas coisas então ele vai mapear o objeto no relacionamento sabe então ele faz esse meio de campo entre as tabelas os relacionamentos e os objetos do Python basicamente é isso assim parece
bem mais complexo do que é explicando assim né E oar perguntou o SQL alkem seria um no skl não o SQL alkem é uma biblioteca para trabalhar com bancos de dados SQL faz faz mais sentido Rafa Obrigado pelo teu super chat aí mano tamo junto Valeu demais então vamos lá pro próximo tópico Então para que que a gente usaria um ORM de alguma forma assim porque muitas pessoas me questionaram isso na na na abertura do curso quando eu falei ah a gente vai usar um ORM a gente vai usar o skl alkim aí tipo não
mas fazer busca é crua é mais fácil Sabe tem você sempre vai arrumar uma briga quando a gente começar a discutir sobre isso mas basicamente o ponto princip para mim é abstração do banco de dados então por exemplo com o mesmo código Eu poderia usar em Teoria em 90% dos casos todos os bancos de dados então se eu fiz um código que é o que a gente vai fazer durante o curso a gente vai usar um banco de dados muito pequeno para desenvolver chamado skite e com o passar do tempo lá na frente a gente
vai usar um banco de dados chamado post skl que para mim na minha humilde opinião é o estado da Arte dos bancos de dados então A ideia é que a gente vai criar uma estrutura em código código Python que consiga abstrair todas essas chamadas de banco de dados ele faz a abstração de conexões ele cria um pull então ele vai trabalhar meio que com várias coisas assim Outro ponto é o quesito de segurança como a gente tá fazendo um curso bem introdutório e eu sei que a gente quer botar a coisa em produção né a
nossa última aula a gente vai fazer Deploy para poder mostrar para todo mundo e funcionando tem vários problemas de lidar com SQL puro Acho que o mais comum é o SQL injection onde o pessoal injeta uns comandos no meio do SQL que quebra a nossa coisa então Depende de como a gente for fazer isso aqui trabalhar com texto puro é meio complicado porque tem algumas alguns problemas de segurança então o RM já resolve esse problema então ele se comunica com vários bancos com o mesmo código trazendo segurança pô já tá ótimo e aí um fator
que é primordial para mim também é a eficiência no desenvolvimento porque a gente consegue automatizar coisas gerar código automaticamente Tem várias coisas várias flexibilidades e várias coisas interessantes que a gente pode fazer com isso eu vou levar vocês um pouco mais pra frente aqui pra gente entender mais ou menos do que eu tô falando porque sabe é muito teórico assim muitas coisas ficam perdidas Então a primeira coisa que a gente vai fazer no nosso projeto pra gente poder brincar é falar sobre é instalar a biblioteca pra gente poder usar ela né então legal lá no
seu no seu shellz inho onde você tem o po e tal o meu diretório É esse aqui Fast zero você dá um CD Vai pro seu não sei onde você tá a gente dá um poetry Ed SQL alemy que é a alquimia do SQL legal aí instalou aqui a gente tá na versão 2.0 do skq tem vários Pets de correção mas primordialmente eu tô eu tô frisando que a gente tá usando a versão dois porque no futuro alguém pode vir aqui isso tá na versão 3 e tá caótico e diferente muito diferente do que a
gente vinha aqui então a gente instala dessa forma poetry Ed SQL alkem não tem aquele group Dev não tem nada a gente só instala e sai usando beleza temos o skl alcem instalado na nossa máquina a primeira coisa que eu quero fazer com vocês é explicar alguns conceitos que são meio esquisitos aqui assim sabe que podem parecer meio meio bizarros aqui então eu vou começar escrevendo esse código com vocês antes da gente ler linha a linha aqui eu quero ir escrevendo ele com vocês porque acho que vai fazer mais sentido da gente escrever então eu
vou criar uma um arquivo novo agora dentro da nossa do nosso Fest zero aí eu sei que o nome do repositório de várias pessoas é diferente mas a gente vai criar dentro da onde tá o nosso app um AP aplicativo chamado um aplicativo uma um arquivo chamado models PP então models ppy E por que que esse arquivo se chama models porque é onde eu tô colocando os modelos de banco de dado eu sei pode não fazer muito sentido agora no primeiro momento mas é quando a gente lida e cria tipo assim tabelas e tal a
gente tá fazendo modelagem do banco de dados então por isso eu vou chamar isso de modelos é onde a gente tá modelando o nosso banco de dados e eu quero agradecer aqui o marl obrigado pela Coquinha do dia valeu estamo juntão Então vamos lá então eu vou fazer o seguinte from sorm vamos indo a gente vai entender impor E aí eu quero importar uma coisa que chama registry E aí o que que quer dizer esse registry aqui quer dizer que ele é uma uma coisa que registra metadados assim metadados é um nome estranho aqui então
Vamos pensar quando a gente tá se preocupando um pouco com o que a gente tá criando dentro do do banco a gente tá fazendo o o Como como que eu posso dizer a gente tá inserindo dados no banco de dados massa e aí o que eu quero dizer quando a gente tá inserindo dados sabe a gente tem uma tabela e essa tabela tem um nome um endereço um telefone a as coisas que estão dentro do do que são os dados do banco são os dados de fato e quando a gente tá falando sobre metadados a
gente tá falando sobre o nome do campo por exemplo ah poderia ser nome poderia ser name em inglês poderia ser batatinhas fritas 1 2 3 isso não não faz diferença então a ideia do registry é registrar os metadados ou seja qual vai ser o nome da tabela qual vão ser os nomes do do do dos Campos que vai ter na tabela quais vão ser os tipos de dados que tem ali dentro então aqui a gente tá registrando metadados então eu vou chamar isso aqui de table registry foi esse nome que eu dei aqui no slide
foi então table underline registry e a partir disso aqui com esse table registry a gente pode começar a montar o esqueleto de como vai ser o nosso Modelo E aí o Bruno perguntou desculpa Model é diferente de esima então esima são sobre formatos de coisas sabe então são sobre esqueletos de cois uma tabela de banco de dados tem um esquim mas o esquim não não contém dados então por isso que a gente chama de modelos sabe o modelo se preocupa com os relacionamentos e tal o esquim é só o esqueleto sabe esse esse esquema então
aí o André perguntou se eu tiver os modelos do pantic é melhor ficar em arquivo diferente do SIM se eu tiver os modelos do piden tipo assim modelos de banco de dados usando piden aí acho que já foge um pouco do nosso escopo aqui tipo assim sabe eu eu vou me focar no que eu pretendi fazer aqui e a gente vai chamar esse esquema aqui chamado de mapad data CL e o que que quer dizer quando eu falo sobre mapad data CL eu tô dizendo que eu tô criando uma estrutura do Python que se chama
data Class e o que que é uma data Class é uma classe de dados em Python Normalmente quando a gente tá aprendendo orientação objeto a gente tá preso Naquele esquema de tipo assim Ah tem que ter um método e esse método executa coisas muta estado de atributos E aí tipo Sabe tem tipos de métodos e tudo mais uma data Class é uma classe que não tem métodos é uma classe que só tem atributos é uma classe de dados então por isso que ela chama data CL e o maped aqui significa que eu estou mapeando ou
seja eu estou criando uma data Class que representa uma tabela no banco Sabe aquele negócio do mapeamento do objeto relacional é isso aqui então a gente vai criar uma clas aqui com qualquer nome poderia ter porque o nome disso aqui não interfere na na modelagem do banco então eu vou chamar de user que é a tabela que gerencia o registro cadastro de pessoas na nossa aplicação e o user Então a partir disso aqui eu já tenho uma tabela alguma coisa aqui do skl não tem nada sabe tipo assim é só o começo dela mas a
gente pode começar a adicionar os dados aqui então vamos lá eu quero que essa tabela tenha um id e o que que é um ID né um campo que identifica isso aqui dentro do banco de dados todo registro tem um identificador do seu próprio registro É como se eu tivesse no Excel né tem a linha um a linha do a linha TR a linha qu aqui é o número da linha para tentar ser um pouco mais simplório e a gente vai falar o seguinte Olha esse tipo de dado aqui no Python ele é o inteiro
massa int E aí a gente vai falar então beleza A gente pegou algumas coisas na aula passada lembra que a gente tinha o o id o id a gente tinha né no user DB a gente tinha o username que é uma string a gente tinha o password que também era uma string e era basicamente esses campos né a gente tinha um e-mail e o e-mail também era uma string E aí o que que acontece aqui eu não posso usar esses tipos esses tipos eu posso usar na dat Class normal padrão do Python só que eu
não posso falar que isso aqui é mapeado porque é o seguinte dentro do banco de dados quando a gente tiver interagindo com ele eu preciso de tipos o banco de dados tem tipos específicos né o banco de dados não é igual o Python que tem o inteiro sabe o banco de dados tem cinco seis tipos de inteiro dependendo de como for tem o Big int que é um inteiro gigante tem o small int que é um inteiro pequeno tem inteiros que suportam só positivos inteiros suportam só negativos inteiros que ficam no intervalo curto entre negativos
e positivos Então eu preciso dizer pro skl alkem eu vou falar uma coisa tipo assim se vira não quero saber qual é o tipo que você vai mapear dentro do banco de dados mas quando a gente tiver trabalhando dentro do código Python esse tipo de dados tem que ser um inteiro então aí a gente importa uma outra coisa aqui que se chama mapper map desculpa e a gente vai falar olha esse campo aqui ele é mapeado como inteiro ou como string e Independente de se lá no banco de dados Isso aqui vai ser um varchar
que é um uma variedade de chars e tudo mais é isso que que que o asm falou aqui se vira nos 30 Exatamente isso sabe eu dou a responsabilidade para ele eu não quero me preocupar se isso é um varchar que cabe 40 caracteres não deixa ele se virar com isso ele sabe o que ele tá fazendo ali dentro então dentro desse esquema a gente começa a ter um esqueminha bem simples bem simples de como isso vai ser se vira no z in Exatamente isso e aí tem um atributo especial que a gente usa dentro
dos Maps que é uma coisa chamada table name isso aqui é relativo ao nome que a tabela terá Quando ela for criada no banco de dados massa então geralmente aqui essa coisa representa um único registro tipo assim um user Quando a gente tiver criando isso aqui só que lá dentro da tabela a tabela manipula vários users né a tabela tem todos os usuários então eu vou chamar isso aqui de users no plural Então dentro do banco de dados isso aqui se chama users só que como isso aqui é um registro e a gente dá um
nome para isso aqui é um nome muito especial assim a gente fala que isso é um registro escalar e o que que quer dizer escalar né coisa de álgebra álgebra relacional então eu trago pra escala ou seja em vez de ser uma linha de banco de dado que é tipo assim uma tupla normalmente ele vai transformar isso aqui em um objeto escalar ou seja user é um objeto Python que se relaciona como uma linha uma Row dentro do banco de dados esses atributos são Então as colunas da tabela Exatamente isso Exatamente isso aí o J
perguntou aqui seria literalmente mapear a classe de dados Exatamente isso mapei essa classe de dados para que ela seja compatível com o banco de dados aí o Pedro perguntou se o fash Api já traz o skl alkem não a gente já acabou de instalar alguns minutos atrás Legal fez sentido e aí eu queria adicionar uma coisa a mais aqui dentro que é o created at created at que é tipo assim uma coisa que explica quando isso quando esse registro foi criado isso aqui é legal para no futuro tipo assim você precisa saber ah esse usuário
já existe foi criado quando ou sei lá quando foi a última vez que esse usuário foi alterado então sabe a gente vai trazer esse tipo de coisa isso aqui vai ser um m de um tipo do Python chamado date time ou seja data e hora então a gente vem aqui importa então from date time date time Import date time que é um objeto de data e h do Python basicamente com com com esses simples comandos aqui a gente consegue criar uma tabela dentro do banco de dados mas antes disso eu quero mostrar para vocês isso
no código como isso se relaciona com como é que a gente usa isso aqui né Eu acho que é importante então legal eu vou dar um Python menos I lembra do modo interativo do Python e vou falar o seguinte executa para mim o arquivo chamado Fest zer T models ah aí ele falou não tem o skl Alem porque eu não ativei o ambiente virtual então poet Shell e agora ele vai rodar legal ó ele falou o seguinte ó ah map maped user could not assembly Any primary Keys colum for the maed table users Olha que
interessante ele falou o seguinte olha dentro da tabela que você criou não existe nenhum identificador que fale ó essa é a chave dessa tabela isso aqui é o que a gente vai usar como gerenciamento da nossa tabela massa então a gente precisa criar isso aqui antes de sair usando massa e aí então a gente entra na parte de restrições de SQL usando um outro atributo do SQL Alem que é o maped colum E aí no maped colum a gente consegue passar propriedades do do SQL para dentro da nossa tabela e eu vou falar o seguinte
Olha esse aqui esse campo ID é a chave primária da nossa tabela E aí a gente pode vir aqui e falar maped column primary Key true E aí ele vai funcionar dessa forma deixa eu agradecer aqui ao Paulo obrigado pelo teu super chat mano ó estamos estamos juntão demais aqui demais total e eu acabei pulando os slides aqui deixa eu voltar para onde eu tava aqui ah aí o o Murilo perguntou por que que uso o registry e não declarative base porque eu escolhi usar o registry tipo só por causa disso tem várias formas de
fazer isso ah declarative base imperative base registry tem tipo umas 20 formas de fazer isso eu tinha que escolher uma escolhia que eu gosto mais que é a do registry então legal lembra que ele falou eu não posso fazer isso aqui e única e exclusivamente porque eu não tenho uma chave primária Então vamos vir aqui e falar o seguinte Olha maped colum então eu tenho que importar aqui mapad colum que é uma coluna mapeada Eu acho que eu tô na frente então talvez eu esteja na frente não tenho certeza a gente vai chamar esse campo
aqui chamado mapped colum no de vocês você pode tipo ir indo paraa frente tá ligado Tipo assim não tem problema ele vai caber aqui dentro E aí eu vou falar o seguinte olha isso aqui é a chave primária isso aqui é o que mantém a integridade dos registros aqui dentro então eu vou passar primary Key true massa legal a partir de agora ele não vai dar mais esse erro M could not assembly primary não tinha nenhuma coisa criada aqui então vamos lá agora ele deixou a gente vir aqui e aí eu posso criar esse user
aqui ó ele existe né é uma classe chamada user a partir do momento que eu tenho instanciar ela Ele vai falar ó você precisa passar o id o username o password o e-mail created at então a gente isso tudo tem que ser nomeado então eu fala ó o ID vai ser um o username vai ser do nosauro o o password vai ser senha o e-mail vai ser mail @mail.com só um uma coisa aqui pra gente testar e o created eu não tenho como preencher aqui ainda porque eu tenho que importar o date Ah não já
tenho date time porque eu importei no arquivo Então vamos lá created created vai receber o date time now pronto E aí agora Ele criou aqui o nosso user aqui ó tá vendo Então ele pegou o id1 username tal tal tal E é assim que a gente vai usar no dia a dia esse tipo de coisa aqui massa Então a gente tem um id1 username o password a senha e tudo mais só que você tá vendo que tem coisas aqui que não fazem muito sentido nesse modelo então por exemplo não faz sentido que eu passe a
chave primária Tipo assim quem tem que decidir qual é a próxima linha é o o banco de dados e aí como eu t usando uma classe de dados uma data Class eu posso falar o seguinte olha init false E aí eu não tô mais inicializando esse objeto a partir de agora todas as vezes que eu for chamar esse objeto eu não preciso mais passar o campo ID porque o sk vai esse dado quando esse valor for pro banco quem sabe qual é o próximo ID Imagina você tá no 5793 foi bom esse número não consigo
repetir Mas quem tem que saber isso é o banco de dados então por isso que a gente definiu que é a chave primária aí alguém perguntou ah como que eu faço Auto incremente aqui o primary Key já faz Auto incremente por padrão então você não precisa se preocupar com isso então a partir dessa pequena alteração que a gente fez aqui se eu sair do terminal então Exit entrar de novo no Import e tentar fazer a mesma coisa que a gente fez a mesma linha que a gente rodou antes ele vai falar olha na hora de
inicializar isso aqui eu recebi um argumento id e eu não tenho que receber o ID porque ele não faz parte da inicialização do banco massa ó agora funciona e ele tá com ID n porque quem atribuiu o ID de fato é o banco de dados e não o SQL alkemy para fazer esse esquema deixa eu agradecer o Daniel aqui Daniel obrigado querido Valeu pelo super chat tamo junto aí assim tem vocês têm perguntas sobre o que a gente viu até agora eu sei que eu fui falando uma metralhadora de falas então eu quero entender de
vocês se tá tudo certo e tipo assim eu quero ouvir perguntas sobre o conteúdo não tipo assim ah na outra versão a outra biblioteca não tipo assim tá tudo bem até aqui Vocês entenderam que isso aqui tipo assim esse é o o nome do campo Esse é o esquema de mapear e os tipos que a gente vai trocar entre o Python e o banco de dados isso aqui Adiciona uma restrição que são basicamente os campos de metadados que a gente vai adicionar para lá massa fez sentido até aqui tudo que a gente viu eu vou
continuar Mas eu vou parar para responder todas as perguntas se vocês tiverem perguntas Então agora eu queria trabalhar mais algumas coisas aqui dentro por exemplo eu não quero ter duas contas na minha aplicação que tem o mesmo e-mail né então o e-mail ele tem que ser único dentro da nossa aplicação Então vamos lá eu tenho o mapad colum E aí eu vou falar o seguinte Olha isso aqui vai ser Unique true ou seja Então a gente tem aqui esse campo não pode ser repetido isso ele vai fazer a validação quando for persistido no banco então
eu não quero que o mesmo e-mail Crie mais de uma conta na nossa aplicação da mesma forma eu não posso ter dois usernames que tem o mesmo nome né Então imagina que tipo assim ah eu tenho cinco dinossauros tipo não não faz sentido Não faz sentido esse esquema init fals ficou obrigatório uso o 100 e já fica Não cara não não é obrigatório eu tô tentando ser explícito aqui tá ligado explícito é melhor do que implícito massa então aqui a gente tem o esquema maped colum esses dois valores São Unique e agora eu vou criar
o seguinte eu quero que esse campo aqui não seja passado todas as vezes porque tipo assim eu não quero saber quando o banco de dados criou um registro eu não quero ter que informar isso o banco de dados tem que saber como a gente chama como a gente pegou essa parada então eu vou falar o seguinte ó maped colum e aí eu vou passar para ele o seguinte aqui eu vou falar que eu não quero passar isso aqui é init false E aí a gente vai atribui um valor padrão para ele e aí a gente
tem o server Def Ou seja a opção quem vai decidir é o servidor E aí como é que ele sabe isso aqui o skq Tem uma função chamada Now e que é essa aqui ó tipo assim funk Now e aí ele sabe qual é a hora do banco de dados ele se resolve com o banco lá atrás então a gente vem aqui e faz o seguinte from SQL alkem Import funk eí eu falar para ele olha quando você criar esse registro funk. Now e aí o skl alkem Se Vira para executar isso aqui e ele
vai fazer uma chamada e tal vai ver que horas são Qual é a data e tudo mais ele vai criar tudo isso automaticamente Então a partir desse ponto a gente vai vou sair daqui né Exit ou cont control cont control D para quem tá mais acostumado e eu vou tentar criar de novo aí ele vai falar ó você tá passando o created e o created não precisa ser passado então a gente remove ele aqui e pronto olha que massa então ele ficou com ID n porque quem decidi o ID o banco de dados e ficou
com created at None porque quem decide isso aqui é o tempo do Servidor e não a gente esses valores vão ser preenchidos quando a gente fizer a comunicação que é uma coisa que a gente ainda não fez com o banco de dados então esses dados ficam em aberto aqui por enquanto mas no momento em que a gente fala olha banco de dados pega esses valores ou toma esses valores aqui a partir desse momento esses valores vão ser preenchidos e a gente vai conseguir saber o o que tem aqui dentro massa fez sentido até aqui esse
é o modelo básico que a gente vai trabalhar aqui dentro do SQL alkem essa aula inteira vai se basear nisso aqui então Se tiverem dúvidas sobre isso podem mandar perguntas aí que eu paro a gente responde e tudo mais César Eu não agradeci teu super chat Obrigado ó um beijo para você tamo junto ah como esse funk Now lida com o tc do banco se for um crud não ele vai pegar a hora do servidor por isso que é o o server de esse funk Now depende do banco você tiver usando ele vai usar um
Now do do banco de dados para resolver isso aqui quem vai fornecer esse dado é o banco de dados Então se o seu banco de dados tiver UTC na Bahia de Guanabara ele vai pegar a hora do Servidor da Bahia de Guanabara sabe tipo para fazer mais sentido aqui legal fez sentido Então se ninguém mandou perguntas a gente continua aqui eu quero brincar com vocês e quero escrever um teste para esse modelo o que sim por que Não por que Não criar um teste para isso aqui então vamos lá agora eu quero entrar com vocês
lá no testes e a gente vai brincar basicamente a gente já escreveu o que precisava est no teste né eu vou criar um arquivo novo porque ele não é do app especificamente ele é um uma coisa que depende do banco de dados Então a gente vai fazer um test under db.py Ah se quiser chamar de test Database test models fica à vontade então o que que a gente vai fazer aqui eu vou criar com o mesmo nome que eu aqui ó test Create user Então a gente vai tentar criar um user aqui Def test Create
user a gente vai tentar criar um user dentro do nosso banco de dados dentro da Nossa aplicação para isso a gente precisa do nosso modelo né de banco de dados Então vamos lá from Fast z0 P models Import user E aí a gente vai fazer o seguinte a gente vai criar ele aqui eu vou chamar ele de user aqui eu não sei se foi esse mesmo nome que eu deixei no slide foi E aí ele tá falando ó a gente precisa passar algumas coisas para ele então o que que a gente precisa passar o username
que no meu vai ser dos mas variem aí brinquem Se divirtam com isso e eu tenho que passar o e-mail e o e-mail vai ser duno @sao pcom E aí a gente também vai como minha fonte tá bem grande aqui eu vou quebrar Mas pode fazer uma linha só que vai dar certo e a gente tem o password e o password vai ser minha senha colocar uns caracteres especial aqui minha senha legal massa então agora a gente tem esse esquema aqui básico da gente acabou de criar o objeto Então vamos validar para ver se ele
funciona então a search user ponto name por exemplo username é igual igual a do nossauro massa se a gente rodar os testes aqui Provavelmente o linter vai reclamar aqui então vamos lá Task test falar ah você tá não tá formatado tal Task forma legal Task test o teste passou massa tá vendo aqui test Create user do DB passou só que vamos vamos vamos pensar aqui o que que esse teste testa tipo assim de fato sabe ele não faz muito sentido deixa eu agradecer a Carol aqui de longe o melhor e mais completo canal sobre Python
muito obrigado pelo carinho tamo junto Valeu demais então tipo assim o que que esse teste testa Sabe eu validei a senha não validei o username não tem problema o que eu quero entender com vocês aqui é o que que esse teste Testa ele não testa absolutamente nada né porque o que a gente quer validar aqui é se a gente consegue criar isso no banco se criado no banco as coisas fazem sentido se tem um ID aqui dentro se foi preenchida a hora do Servidor aquele tanto de outras coisas lembra que a gente só criar o
objeto é só uma criação de objeto a gente não consegue fazer nada com isso a gente não consegue garantir nada beleza a gente consegue garantir que na chamada do do objeto dá para passar username email e password Mas tipo isso não quer dizer muita coisa a gente tá provando aqui a gente tá testando garantindo afirmando que a gente consegue criar uma classe não não não tem muita informação interessante aqui então o que que a gente precisa aqui a gente precisa se preocupar com algum alguns critérios tipo assim dá para criar essa tabela E aí aí
entra aqueles casos que a gente estava falando sobre met datas lembra e o segundo ponto é se é possível buscar um user né então beleza A gente tem que saber se esses dados são suficientes para criar essa tabela no banco de dados se não tem nenhum erro a hora que for criar no banco e também a gente quer saber se tipo assim tá tudo certo a gente consegue buscar esses recursos então para isso a gente precisa conhecer duas coisas novas do skl Alem aqui você viu que o skl Alem é uma metralhadora deis né é
map map col dat Class map com não sei oer table sabe Ah eu sei também eu sei que é complicado são muitos conceitos e tudo mais mas eu queria falar sobre duas coisas aqui uma é a Engine que é o motor da coisa traduzindo e o outro é a sessão são dois componentes interessantes que o skl Alem tem além dessa parte de modelagem que a gente vai precisar conversar um pouquinho sobre eles toda vez que eu falar sobre Engine eu tô me referindo ao ponto de conexão que a gente vai ter com o banco de
dados então imagine o seguinte Olha eu tenho um banco de dados rodando aqui em algum lugar na minha máquina ou em outra máquina em sei lá na Bahia de Guanabara como a gente tinha dito aqui e eu preciso me comunicar com ele porque o banco ele pode estar local ele pode estar em outro lugar então eu preciso ter um jeito de passar o endereço desse banco de dados e ao mesmo tempo que eu tenho que passar ele tem que se comunicar ele tem que conectar criar uma conexão com esse banco de dados que tá em
outro lugar então é É nesse quisito que entra a Engine Então existe uma função aqui dentro do skl alkem que se chama create Engine eu vou eu vou brincar com vocês aqui por enquanto eu vou fazer o seguinte então vamos criar uma Engine aqui dentro desse esquema então from SQL Alem Import Create Engine massa então Create Engine eu quis dizer como o banco vai ser na nossa máquina ele pega o horário local da nossa máquina ou da rede ele pega o horário do banco de dados o banco de dados pode est em outro fuso da
máquina que tem aqui então ele pega o o horário do da aplicação que tiver rodando o banco de dados não é o horário da rede nem da máquina é do banco então eu vou chamar isso aqui Engine por exemplo e a partir disso aqui eu começo a passar a forma em que eu vou me comunicar com o banco de dados Legal tem várias formas de fazer isso aqui você a aqui entraria qualquer aplicação de banco de dados Sei lá o posters o sqlite o SQL server o cock DB o my sequel o Maria DB e
tudo mais pra gente começar a usar eu vou usar o skite que é um banco que é um arquivo local na nossa máquina é o suficiente porque a gente precisa para fazer essa aula aqui massa então eu vou falar o seguinte SQ Lite dois pontos 1 2 3 Barras e eu vou criar um arquivo chamado database.db massa ele vai criar um banco de dados no momento em que fizer essa conexão ele não faz isso para todos os bancos é que o skite tem essa característica específica de ser um arquivo então ele vai criar esse arquivo
pra gente e vai funcionar vamos rodar aqui e e ver o que que acontece vamos lá vou no Shell de novo vou executar o teste aí ele reclamou por causa de formatação e tudo mais então Task Format ele falou a essa variável Engine foi criada mas nunca foi usada Beleza eu vou tirar ela daqui porque eu quero mostrar para vocês a criação primeiro aqui legal Task teste você viu que ele demorou um pouco mais agora para rodar o teste mas ele criou um arquivo aqui dentro ah Aonde tá ele tinha que tá aqui o database.db
em algum lugar Ah ele não criou o arquivo porque eu não falei para ele criar nada dentro dele ainda ó eu eu mesmo estou me precipitando aqui então legal a gente tem isso aqui então a gente tem Engine aqui que é que abre a conexão com o banco de dados a partir desse momento eu preciso falar pro banco que eu quero criar coisas aqui dentro ou seja cria a tabela que a gente tinha essa tabela users só que pensa comigo se eu tiver que falar pro banco criar todas as tabelas cria tabela a cria tabela
B cria a tabela C cria tabela d cria tabela e f g h não vai fazer muito sentido e é por isso que a gente estava conversando sobre os os metadados né então os metadados são os dados de como as tabelas são organizadas E lembra que quem toma conta disso é o registrador que a gente fez essa coisa aqui que era o registry Então vamos importar ele daqui ó o registry toda a tabela que a gente criar a gente vai falar para ele olha registra classe de baixo registra classe de baixo então ele conhece todos
os metadados da nossa aplicação então eu posso vir aqui para ele e falar o seguinte olha [Música] table registry que foi essa parada que a gente importou e a partir dele eu posso falar o seguinte olha table registry P metadata olha que massa existe metadados dentro do registro legal ele sabe qual é todo o esquema do banco e eu posso falar o seguinte Create All cria todos os cria toda a estrutura do banco para mim aqui enquanto você for rodar esse teste Então olha que massa a gente criou uma conexão com esel que é um
banco de dados de texto Por enquanto um arquivo e aí a gente falou pro registry que é aquela coisa que conhece todos os metadados pega esses metadados e a partir desses metadados cria a tabela usando a Engine que é essa conexão com o banco de dados que a gente fez sim é muita coisa eu sei que é muita coisa agora é um momento bom para fazer pergunta se vocês precisarem disso eu vou rodar de novo e vamos ver o que que acontece se a gente vier aqui agora Ele criou um arquivo chamado database.db aqui dentro
e a gente pode vir aqui é um arquivo binário basicamente mas aqui se a gente vai ver que ele criou exatamente a tabela como precisaria criar no banco de dados olha que massa então ele criou aqui ó ele falou olha a gente tem um ID que é um inteiro e ele é não nulo ou seja porque ele é é um ID né ele tem o username que é um varchar Ou seja que era o string a coisa como isso se dava lá no banco de dados aí ele também ele não é não nulo password a
mesma coisa e-mail aí tem o created at que é um tipo date time que tem o default aí ó a pergunta que vocês fizeram ali ó da onde vem o tempo o tempo vem do current time stamp Ou seja é uma função que o banco de dados executa aqui massa e ele falou a chave primária o id o campo username é único e o campo e-mail também é único então ele já criou tudo isso aqui pra gente se você tiver um visualizador de banco de dados você pode usar aí para ver o que que tá
acontecendo dentro desse arquivo eu Por enquanto ainda não vou fazer isso então ele fez esse esquema aqui para mim aí dentro disso entra o outro quisito que é outra coisa que a gente tinha visto que é o session Então vamos falar um pouco sobre o session agora então ó Por que o t não utiliza um singleton para criar todas as tabelas com apenas uma instância é isso é exatamente isso que ele faz Evandro ele pega ele é um singleton ele registra todas as tabelas e a gente usa ele é literalmente isso então nos testes você
cria um banco separado a gente vai chegar lá Carlos a gente vai a gente vai chegar lá e aí o que que acontece com o session então o session aqui ele é basicamente uma camada intermediária entre o nosso código ó ó Isso aqui é muito muito importante ele é o ele é uma camada intermediária entre o nosso código e e o quê e o banco de dados obviamente então ele faz esse meio de campo massa então a sessão é alguém que fica no meio da coisa e que a gente fala ó sessão manda esse dado
pro banco sessão atualiza o banco de dados sessão traz isso aqui para mim para eu não ter que ficar fazendo chamadas diretas pro banco de dados eu faço esse tipo de coisa então eu começo a passar tudo pra sessão a sessão tem alguns padrões de projeto implementado a gente vai conversar sobre isso na próxima aula mas por enquanto vamos pensar o seguinte eu vou trazer esse objeto sessão para cá então from SQL alkem pon RM Import session massa e eu vou falar o seguinte olha vamos criar uma sessão daqui então ó eu vou criar em
qualquer lugar aqui não não tem não tem um lugar certo então eu tenho a session e eu vou falar o seguinte olha cria essa sessão para mim A partir dessa Eng massa e aí eu poderia fazer dessa forma tem várias formas de fazer isso aqui a minha forma preferida é essa aqui with session as session E aí tudo que acontecer aqui tá rolando dentro dessa conexão com o banco de dados olha que massa então agora a gente vai pegar esse objeto isolado e falar o seguinte olha session pega esse user aqui e adiciona ele na
sessão que user esse aqui que a gente acabou de criar então ele cria um espaço de staging um espaço temporário onde ele vai adicionando essas coisas então imagina nele como se fosse um um sisteminha em memória falei ó adiciona na sessão E aí a sessão não faz nada ela ela não vai pegar isso aqui e adicionar dentro do banco de dados eu tenho que falar para ele olha faça uma ação e aí eu falar o seguinte session pcit a partir desse momento em que eu mandei o commit dentro da session ele vai pegar todas as
operações que a gente adicionou ou removeu da sessão Vai juntar tudo e fazer a persistência igual a gente faz no Git sabe tipo assim que a afirmação pega tudo isso aqui e e bola pra frente então o Comet faz Exatamente isso a partir desse ponto A gente pegou todas as coisas que estavam na sessão e persistimos dentro do banco de dados Essa é a ideia que a gente tem aqui dentro do tipo uma área de transferência Exatamente isso é é é esse exatamente o ponto hum atomicidade sim ele cria isso aqui é um padrão de
projeto chamado unit of work ele pega todas as unidades de trabalho e faz uma persistência só para quem quiser ser mais avançado nos termos aí legal então a partir disso aqui ele vai persistir esse essa coisa esse user lá no banco de dados tem uma outra operação que é muito importante aqui que é o refresh então falar o seguinte olha session atualiza para mim o user porque você tá vendo que o dado que eu mandei para ele não tinha tá vendo tipo assim o dado que eu mandei para ele não tinha id não tinha hora
de criação não tinha nenhuma dessas coisas então eu tô mandando para ele aí eu falo olha sincroniza esse objeto que a gente mandou com um objeto que tá lá dentro do banco de dados sabe faz uma atualização a partir desse momento por exemplo o user vai ter ID por exemplo igual a um saca então ele funciona dessa forma aqui vamos rodar e ver o que que acontece passou o teste porque ele persistiu esse usuário que tinha o número um na base de dados se a gente quiser ver isso aqui eu acho que eu tenho alguma
coisa de banco de dados eu provavelmente tinha mas eu esqueci o nome agora de uma aplicação de banco de dados Database [ __ ] esqueci o nome é beeper o que eu tenho aqui isso achei E aí cada um tem um que usa aí que gosta mais e tudo mais aí eu vou falar olha eu quero ir no skite eu vou escolher o arquivo e o meu arquivo tá aqui dentro da minha home e a gente tem o fast z0 esse arquivo database.db e eu dou um Connect e a gente tem olha o que que
ele fez ele criou uma tabela de users dentro dessa tabela ele tem o ID username e-mail password created at se a gente criar clicar aqui a gente consegue ver exatamente o registro que ele criou dentro da nossa tabela eu tô na frente eu sei mas aqui ó a o id1 username minha senha legal duno @ Sauro created e tudo mais massa funciona muito bem e já deu esse esquema então o refresh Ele trouxe pra gente esse objeto E aí qual é que é a parada aqui se eu rodar esse teste de novo ele vai falhar
E por que que ele vai falhar ele vai falhar por um motivo muito específico Eu Já criei um ID no banco de dados de produção que se chama um a partir do momento que eu rodar esse teste de novo o ID retornado vai ser dois vamos rodar de novo ó passou deu erro aí ele falou Unique constraint fail aí ele falou user eil ele deu erro porque lembra que o e-mail é Unique o e-mail é único então ele não pode criar dois os dentro da nossa aplicação com o mesmo e-mail se a gente mudasse o
e-mail aqui duno 2 @ao ele ia dar erro no username agora em vez do e-mail vamos rodar ó Unique constraint failed username e assim ele vai então tipo assim dinossauro 2 massa então tem várias falhas aqui que a gente vai pegar dentro desse esquema E aí o que que tem que tem que acontecer aqui para esse teste poder ser determinístico que é uma coisa muito importante aqui pra gente a gente vai ter que pensar eu vou eu vou pular eu vou voltar nesse slide aqui mas eu quero ir para cá a gente vai ter que
criar o o selite em memória que é uma forma de burlar isso em vez de criar um banco de dados físico dentro do um espaço físico no nosso HD um banco de dados de verdade crie um banco de dados volátil em memória que a gente pode jogar fora sabe então toda vez o ID vai ser um toda vez esse username vai ser criado do zero Então vamos pensar o seguinte em vez de usar esse endereço database.db Inclusive eu vou até remover esse arquivo RM Database ah eu tô dentro da pasta dos Testes RM database.db eu
vou vir aqui e vou colocar o seguinte dois pontos Memory e agora ele não cria mais o banco de dados ele cria em memória e esse banco dura durante o teste Então a partir de agora como toda vez o banco de dados que tá sendo criado é um banco de dados novo do meio do teste a gente pode ir fazendo essa atualização a partir de agora o teste vai sempre rodar os testes vai sempre passar porque como o banco de dados está em memória quando acaba de rodar o teste ele começa de novo E aí
a gente vai fazendo isso aqui e pode fazer isso quantas vezes quiser e o teste vai passar porque como o banco está em memória ele deleta o banco sempre que que o teste acaba de rodar como só tem um teste nesse caso ele tem esse esquema aqui dentro massa fez sentido aqui o que aconteceu aqui eu sei que é muito conceito né então por isso eu criei esse grafico Zinho aqui pra gente tentar entender Espero que esteja visível vocês consigam enxergar isso aqui né a gente tem ó o SQL alkem o ORM que a gente
tá usando ele fornece uma sessão que é quem a gente tá usando para se comunicar aqui né a session é quem adiciona Quem faz o commit quem atualiza quem faz todos esses tipos de coisa a session para ser instanciada Ela depende da Engine ou seja não não existe uma sessão que não tenha um de dados para se comunicar né como é que eu vou abrir uma sessão sem ninguém sabe Leandro Obrigado cara pelo teu super Sticker estamos junto Valeu demais então a gente precisa dessa comunicação aqui isso acontecer E aí a Eng é quem se
comunica com banco de dados a session ela também interage com os modelos que a gente criou e os modelos tem metadados e esses metadados T informação das tabelas que estão no banco de dados e os modelos também são mapeados para tabelas de banco de dados então no final é tudo isso aqui é o modelo o modelo interagindo com a session com a Engine a session é o meio de campo onde a gente vai sempre se comunicar com ela a gente pega os objetos Python e passa PR session e a session fala ó massa funciona hein
então é esse esema a estrutura em memória funciona para todos os bancos não funciona pro skite em específico que é o banco que a gente tá usando aqui massa Então a partir de agora todos os testes funcionam e eles passam e massa demais legal deu para entender mais ou menos como que isso aqui funciona agora eu quero fazer um esquema um pouco diferente disso aqui eu quero pegar a session e em vez de dar esse refresh que a gente deu aqui que foi um comando que a gente aprendeu eu quero fazer o seguinte eu quero
que a session encontre o objeto que a gente criou fazendo uma qu SQL mesmo então eu vou falar o seguinte session pon scalar no singular lembra o que que é scalar me retorna o registro do banco de dados no formato de um objeto Python Então faz o mapeamento e me traz esse objeto e agora a gente vai fazer o seguinte aqui eu vou pegar e vou importar o select igual a gente faz no no SQL normal select sabe select user tal tal tal aquela coisa que a gente faz sempre então eu pegar ISO aqui eu
passar esse select e falar ele ó encontra agora é o tipo tá vendo é o tipo não é o user Então faz um select para mim então seleciona toda a tabela de usuários desse usuário faz um filtro onde where user ponto e-mail é igual a duno @sao comom E aí Isso aqui vai retornar um objeto tá vendo que é esse objeto que a gente queria aqui então ah sei lá result E aí a gente pode ver aqui o seguinte result P name ponto username é igual igual a dinossauro se sim o teste passa se não
o teste quebra massa pergunta o skq lite já veio junto com skl alchemy ou você instalou por fora o SQL Lite vem junto com a instalação do Python massa O Miguel fez uma pergunta muito específica mais avançada cara não é o momento Pergunta lá no grupo que a gente troca ideia sobre isso cara massa vamos ver se o teste funciona Task teste massa Funciona olha que lindo só que aí vem aquela coisa tipo assim pô que que alguém falou aqui ah eu vou ter que eu não lembro onde isso foi perguntado aqui tipo assim ah
mas eu preciso criar isso toda vez em todos os testes não a gente pode fazer uma fixture do mesmo jeito que a gente fez pro pro client a gente pode fazer pro session maassa Então a gente vai criar uma Fure de session aqui e aí onde que a gente cria as fures lá no conf test maassa Então vamos lá testes conf test.py e agora a gente vai começar a criar um @ by testfixture E aí eu vou criar um dep session aqui dentro que vai ser alguém que já dá toda essa comunicação do banco de
dados porque imagina eu ter que pegar todas as vezes que eu quiser testar o banco de dados eu tenho que pegar esse valor aqui ou é meio chato né então a gente vai fazer o seguinte ó todos os nossos testes vão rodar em memória massa se eu fizer uma alteração no objeto sim se for antes do commit vai pegar acerte result user não dá certo não porque o nosso user precisaria do refresh para dar certo mas essa é uma questão depois a gente conversa sobre isso vamos vamos focar aqui no no que a gente tá
fazendo então vamos lá from SQL alkemy Import Create Engine massa Então a gente tem uma Engine para fazer essa fixture e eu posso falar o seguinte olha preciso dos metadados que a gente tinha lá né então from Fast z0 ponto models Import a gente precisa dos metadados então para ter os metadados a gente precisa importar o table registry e falar o seguinte olha table registry p metadata ponto cria para mim tudo que tem aqui dentro massa Create All E aí depois que o teste acabar Olha que interessante depois que o teste acabar eu quero que
você destrua tudo drop All Então a partir disso aqui O teste vai acontecer aqui nesse meio de campo aqui e aí ele vai fazer a conexão criar todos os registros criar todos os metadados dentro do banco de dados que tá em memória alguma coisa vai acontecer O teste vai ser executado aqui no meio e depois dessa execução destrói o banco de dados inteiro ou seja ele vai ficar recriando o banco a cada teste isso faz que a gente consiga garantir que todo o ID vai ser o um que todo sabe que a gente não tem
que ficar com esse coisa tipo assim não mas já criei esse ID Ah não Mas qual que é o ID que vai voltar agora então a gente fica sem essa preocupação aqui dentro do nosso projeto E aí o que que faltou aqui faltou a session né então vamos lá from RM Import session E aí eu já sei que ele vai reclamar porque S vem depois do e eu vou fazer o seguinte aqui vem uma coisa que que é um pouquinho de recurso de Python aqui eu vou chamar with session Engine S Engine e alguém tinha
perguntado ah Aonde eu consigo explicações sobre o que que é o Wi Wi significa gerenciamento de contexto e tem uma live aqui no canal sobre gerenciamento de contexto Se alguém puder fazer as honras de pegar o número dessa Live ou link e deixar aqui vai vai ser ótimo aqui para mim Se alguém puder fazer isso E aí o que que vai acontecer aqui Aqui vai entrar um outro recurso de Python além do Wi vai entrar uma palavra reservada chamada yd E aí o Wild ele transforma essa fixture que se chama session em um gerador Live
43 Obrigado Luiz ele transforma [Música] o qual é o erro que tá dando aqui não sei porque que ele tá reclamando e aí o Wild vai transformar essa coisa rodando Isso aqui então o que que vai acontecer o teste vai rodar até essa linha Ó imagina a fixture vai rodar até a linha do wield E aí ele vai dar aqui não é Engine session por isso que tá que tá errado é isso ó session Engine session session e o que que vai acontecer quando a gente pegar esse objeto session a fixture vai rodar até essa
linha até a linha 21 E aí ele vai parar de executar esse objeto que foi dado aqui é o que vai cair lá dentro do teste quando a gente passar aqui s Olha que interessante agora o nosso teste fica bem mais simplório aqui e E aí o que que vai rolar ele vai pegar essa sessão aqui a session E vai retornar então ele vai executar até aqui Wi vai delimitar aonde é uma coisa que a gente chama de setup que que é o que vai rodar antes do teste Ou seja que é o arrange que
a gente viu nas outras aulas e depois do wield é uma etapa que a gente chama de Tier Down ou seja desfaz a operação que você fez quando você fez o arrange massa então a gente começou aqui então Ó arruma para rodar o teste então cria o banco cria o banco de dados em memória cria os metadados as tabelas cria a sessão usando esse esse banco que a gente criou e retorna aqui aí a gente cai dentro da session e depois disso aqui quando o teste acabar se ele der certo ou errado não me importa
roda a etapa de tear Down que é o que vem depois então ele vai dropar as coisas que tem aqui dentro Então essa é a delimitação do que o Wild faz o Wild é um gerador mas retorna O valor também não ele ele empurra o valor pra frente eu não vou entrar muito em questões de geradores aqui dentro dessa aula senão bom tem tem uma série aqui no canal que é tipo cinco lives sobre geradores então tipo eu não vou entrar muito nesse assunto mas se alguém puder pegar aí tipo assim tem uma tem uma
uma playlist aqui no canal que se chama introdução a cor rotinas vale a pena dar uma assistida que é onde eu falo sobre o wield de uma maneira geral são tipo cinco seis lives tá tudo bem isso essas duas expressões aqui são um pouco idiomáticas em Python mas a gente segue por ela só só precisa entender isso aqui tipo assim vai executar até aqui quando o teste acabar ele executa essa linha de baixo aqui massa então o nosso teste ficou bem mais simples a gente tem várias coisas que a gente não tá usando mais aqui
table register e tal a gente tá a gente tem só o que a gente tá usando e a partir desse momento se eu rodar o teste de novo o teste passa mesmo se a gente fizer aquela validação que a gente estava brincando ah o res pid vai vai ser sempre um vai ser sempre Um independente de quantas vezes eu rodar o teste porque ele tá criando e destruindo o banco em todos antes e depois de todos os testes ele tá fazendo esse esquema maassa então Independente de quantas vezes eu rodar isso aqui ele vai funcionar
E aí esse é o esquema da fixture que a gente tem então a gente tá carregando o banco em memória criando ele a gente retorna ele e depois a gente Dropa tudo massa legal Fei sentido ó a galera tá falando que a Live sobre wildd é a 151 É isso aí fiz um concurso perguntou sobre o Wild mas não conheci esse comando achei errado e acabei errando a questão sim Y é uma coisa muito idiomática do Python paraa criação de cor rotinas ou geradores então é é um pouco confuso tem uma playlist aqui no canal
para quem quiser brincar depois tipo assim ah YouTube Dinossauro para quem quiser ver isso depois é é um assunto um pouco chato aqui mas se vocês quiserem tá aqui tipo assim ah SQL alkemy projetos tal tal tal playlists orientação paralelismo cara não achei aqui aqui ó essa aqui ó essa playlist aqui são geradores com rotinas e tudo mais esse assunto é um assunto bastante complexo então a gente vai passar por aqui só precisa entender isso existe essa função para de executar cede a vez pro teste e depois ela volta e termina esse esquema aqui dentro
essa é uma expressão bastante idiomática do Python bom aqui eu expliquei mais ou menos o que tava acontecendo ali Aí voltei no teste o teste é aquela coisa que a gente foi fazendo junto né então acho que não tem muito mistério e antes da gente passar pro próximo tópico eu queria saber se tá tudo bem com vocês se tá tudo legal eu sei que tipo assim eu não parei para explicar o Wild mas tipo assim só a explicação do Wild seria maior do que essa aula inteira do curso Então perdão pelo vacilo massa Então vem
perguntando vem falando comigo vamos conversando juntinho aqui bom agora que a gente tem um banco de dados de fato que a gente pode usar a gente tem um modelo criado que a gente pode colocar dentro da nossa aplicação e fazer algumas coisas existem alguns outr Alguns outros fatores que são importantes da gente discutir aqui que é o seguinte como é que eu vou criar um banco de dados aqui dentro da minha aplicação sabe vocês já entenderam que isso aqui é um problema né essa linha aqui específica eu tenho que passar exatamente o dado que coloca
o meu de dados sabe não sabe não não não não vai rolar tá ligado isso aqui é um dado de configuração aqui dentro do teste faz sentido Ele tá em memória mas no escopo global da nossa aplicação imagina que tipo assim pô eu preciso trocar o banco de dados da aplicação eu preciso sabe isolar variáveis coisas que são relativas ao ambiente ou seja o banco de dados é uma configuração de ambiente né tipo assim a aplicação em teoria ela não tem que saber em qual banco que tá sendo usado Qual o endereço do banco de
dados sabe todas essas coisas são importantes a gente pensar Então eu preciso de uma forma e e aí a gente tem algumas algumas regrinhas sobre isso que são os 12 fatores para quem quiser depois dar uma procurada é super interessante no link da aula tem uma live que o Bruno Rocha veio aqui no canal para falar sobre 12 fatores mas 12 fatores é um esquema interessante que fala sobre boas práticas de como construir uma aplicação Então acho que vale bastante a pena dar aqui ó codebase dependence config e tal tem várias coisinhas várias regras de
boas práticas aqui um dos 12 fatores é excluir variáveis que fazem parte do nosso ambiente e externalizar isso tirar isso dentro do código isso não pode ficar hardcoded dentro do nosso código então a gente não quer que isso faça parte do código e para isso a gente tem que extrair essas coisas que fazem parte do ambiente Pô qual é o banco que tá rodando beleza eu posso saber que é um sqlite mas eu não preciso saber aonde ele está isso não precisa fazer parte do código imagina que dá erro numa máquina e eu tenho que
entrar na aplicação mudar o código fazer um novo Comet fazer outro Deploy rodar os testes para ele subir outro banco de dados eu não quero que isso aconteça na aplicação de vocês e eu eu prezo que a gente entenda um pouco das boas práticas pra gente fazer essa coisa de tirar coisas hardc a gente precisa ter um jeito de ler variáveis ou de arquivos que não são intrinsecamente ligados ao código ou então a variáveis de ambiente para isso a gente tem uma biblioteca ou uma extensão do pentex chamada pentex settings ou seja configurações é p
identics para p identic para configurações eu alguém alguém vai falar Tipo assim Ah mas aí por que que não usa biblioteca tal é porque que a gente vai usar o pantic settings antes que chegue a pergunta legal então vamos lá qual é que é a ideia aqui do pantic settings eu vou criar um novo arquivo aqui dentro do nosso projeto Então vamos lá aqui dentro do Fast zero que eu vou chamar de settings ou seja aonde estão settings.com settings.py aonde estão nossas configurações do nosso projeto ou seja tudo que for relativo à configuração a gente
vai colocar nesse arquivo e pra gente ter o p identic settings a gente a gente vai precisar instalar ele então poetry Ed pid dentic settings que é para instalar o pantic settings o penic settings ele é idêntico ao pid dentic só que ele gerencia tem coisas relativas à configuração de arquivos ou de ambiente ou de ler variáveis coisas desse formato coisas que são externas da aplicação mas que precisam ser trazidas pra aplicação de alguma forma massa Então vamos lá então from pid Ah pera aí que eu eu preciso restartar meu lsp aqui lsp Restart workspace
from pid dentic settings Import aí em vez do base Model que a gente tinha a gente vai importar o base settings E aí eu vou criar uma classe que é igual do P identic tudo que a gente viu até agora que eu vou chamar de settings que é configuração E aí vou trazer o base settings aqui PR dentro massa interessante super simples e a partir daqui a gente vai começar a colocar coisas que são relativas ao ambiente mas que não fazem parte da nossa aplicação Então vou criar uma variável de ambiente que é aonde tá
o banco de dados então Database Database URL e ela é uma string massa é só isso aqui que o penk precisa só que como eu quero ler isso de um arquivo um arquivo de ambiente ambiente em inglês se escreve environment E aí então a gente vai usar um arquivo específico para colocar configurações específicas do environment esse arquivo por padrão se chama ponto Envy então eu vou vir aqui no meu no meu arquivo no no meu editor e vou criar um arquivo chamado ponto env ele tem que tá na raiz do projeto massa Então a gente
tem esse arquivo chamado ponto env e aí eu vou falar pro P identic que eu quero ler esse arquivo quando aplicação começar Então a gente tem o dict [ __ ] esqueci o aqui ó settings config dict eu vou arrumar aqui para vocês conseguirem ver o que eu tô importando né porque eu acho que a câmera tá na frente então a gente tem esse esquema aqui que eu que é o settings config dict e a gente tem que passar para ele uma coisa chamada Model config e a gente vai passar essa configuração aqui para ele
a partir disso aqui eu preciso falar para ele aonde está o arquivo de environment que tem as variáveis de ambiente então Envy file Então o meu arquivo de configuração aonde eu quero ler as coisas que são relativas ao ambiente que não são da aplicação é o ponto env que é o o arquivo padrão aqui só isso aqui já resolveria Mas como eu sei que isso aqui pode dar um chabu na máquina de alguém eu vou colocar aqui esse esquema que é o env file encoding Envy file [Música] encoding E aí esse en file encoding que
a gente vai usar aqui eu vou usar utf8 tf8 que é o o formato padrão de arquivos no Unix que é no Linux e tal Ah mas eu uso Windows aqui é o TF 166 bote o tf8 por que botar o tf8 porque isso aqui vai rodar no Linux quando a gente for colocar em produção quando subir fizer o Deploy então é importante que seja o tf8 massa e aí que que a gente faz a gente vai pegar esse Database URL aqui e vai preencher lá no vnv então por exemplo Ah aqui ó é é
literalmente isso aqui então eu coloco aqui e passo um valor para ele então por exemplo ah S Lite 1 2 database.db massa massa Olha que interessante Então a partir disso aqui se a gente quiser fazer cham arquivo settings aqui dentro e eu f f o seguinte Python ah Fast zer settings E se eu chamar settings aqui olha que interessante se eu chamar a classe de Opa é Python menos I né para ele ser o interativo se eu chamar o settings olha que massa ele já carregou para mim a variável que tava no meu ponto env
massa então ele já carregou o arquivo que tinha lá se a gente criar mais variáveis e preencher esse arquivo com mais outras coisas que é o que a gente vai fazer nas próximas aulas a gente vai continuar pegando essas configurações daqui então Ele sempre lê esse arquivo por padrão e a partir disso ele traz isso aqui isso é interessante porque imagina o seguinte quando a gente for para um outro ambiente o ambiente de teste ambiente staging falando de vida real de de uso do Framework uma aplicação com fash api por exemplo rodando na empresa a
gente só precisaria mudar esse arquivo que é um arquivo que não tá no Git ele não é version a gente pode trocar as coisas e o código fica intacto por conta disso aqui então essa é uma daquelas coisas que faz parte do 12 fatores né então é esse esquema e ele como P idêntico Verifica o tipo verifica verifica ele vai fazer coersão porque string né basicamente qualquer coisa em Python pode ser convertida para string mas se fosse um inteiro ele validaria se é um inteiro massa então funciona você colocar um int aqui int e tentar
fazer isso aqui settings ele deu erro falou ó Ah isso aqui veio uma coisa que era um string mas eu queria que fosse um inteiro poderia ser massa Então ele continua sendo o p dentic de de todo dia massa legal tipo se eu tiver var um é é exatamente isso ele faz as coerções ele faz as validações ele faz tudo ele é o piden normal só que preparado para Ler arquivos de configuração massa então entendemos essa parte aqui de abstrair o valor do banco de dados aí a gente cria né esse arquivo ponto env tem
que se chamar ponto env e talvez o ponto env fique oculto porque o nome dele começa com um ponto e todo arquivo que começa com ponto se você listar sei lá der um LS ou um Gear no Windows que lista os arquivos ele não vai aparecer tipo no Mac no Linux LS no no Windows Gear ele não vai aparecer E por que que ele não vai aparecer porque ele é oculto tudo que começa com ponto é oculto E aí agora a gente vai criar esse arquivo quando iniciar a aplicação ele vai criar o o database.db
E aí como a gente quer que ele crie esse arquivo database.db a gente vai ter que colocar ele lá no Git ignor né então vou vir aqui e vou colocar aqui ó eu não quero que você suba pro Git o meu banco de dados então database.db então ele vai ser ignorado não vai subir pro repositório E aí tá todo mundo falando ó manda o like manda o like faltou o like aí tem mais gente vendo que like feio hein massa fez sentido isso aqui aí a partir disso a gente entra no esquema que é migrações
que é é a segunda parte da aula né então agora a gente estava usando antes a gente criou modelou o banco de dados fez o que precisava ser feito e subiu esse esquema e tudo mais criamos o esqueleto da tabela fizemos tudo que deveria ter sido feito agora que que a gente vai fazer agora eu preciso criar uma evolução no meu banco de dados ou seja imagina o seguinte amanhã imagina que a gente sobe esse código paraa produção a gente já tem essa tabela criada certo só que imagina que amanhã o banco muda porque eu
criei outras tabelas só que deu alguma coisa muito ruim em produção e eu preciso voltar como tava antes sabe eu preciso voltar falar ó volta a aplicação como tava antes tipo não tá legal deu pau em produção e aí a migração ela é uma coisa que cria o banco de dados evolutivo para quem estudou banco de dados formalmente na vida um dia sabe que se perde meia vida especificando como vai ser o banco de dados de produção tipo assim vamos pensar em todas as tabelas vamos pensar em todos os todos os todas as colunas todos
os relacionamentos e perde perde-se um mês em reuniões criando tabelas Então dentro dessa metodologia ágil mais moderna que a gente costuma usar entram esse conceito de evolutive databases ou seja bancos de dados evolutivos e a partir desse banco de dados evolutivo a gente vai começar a trabalhar com ele da maneira mais crua então ele a gente a gente vai gerenciar versões do banco de dados a partir do código isso são migrações Ou seja eu vou criar uma migração falar ó Eu tenho essa tabela com esses campos esses tipos e tudo mais toda vez que eu
trocar de banco de dados eu consigo aplicar esse Patch essa configuração do banco de dados em qualquer banco de dados que seja então a gente gerencia as versões de como o banco de dados vai est a partir do código é isso que significa migrações e a gente pode reverter a gente pode ir pra frente a gente pode fazer tudo que for possível aqui dentro aí perguntou se eu coloquei no conf test não eu não vou usar lá lá vai ser o banco de dados em memória massa então é para isso que serve o esquema de
migrations não sei se eu fui completamente explícito mas se tiverem perguntas por favor Façam as perguntas é é de perguntas é é para fazer perguntas que a gente tá ao vivo né Então vou adicionar o al dentro da nossa aplicação então poetry Ed alambic poetry Ed alambic alambic alambic de de cachaça é É exatamente esse o nome Obrigado Luiz tamo junto que tá todo mundo aí falando Alambique de cachaça é exatamente isso alambic a Cachaçaria ã essas migrações também valem para os dados do banco de dados então ah são duas coisas diferentes migrações são sobre
esqueletos de metadados de tabelas quando a gente tá falando sobre dados criação de dados o conceito é outro se chama data ced deixa eu mandar aqui ó data Sid como se escreve isso né Se alguém quiser depois E aí é outra coisa não é migração é dados que iniciam né são as raízes do banco de dados as sementes pro banco de dados começar a funcionar Então são data Seeds existem outras ferramentas para fazer isso alic é para migrações mas existe o data seed para esse tipo de coisa então a gente instalou o alic agora vamos
iniciar o alembic dentro da nossa aplicação como é que a gente vai fazer isso aqui a gente vai chamar o alembic então alembic init aí o init vai iniciar alguma coisa então eu quero iniciar o sistema de migrações E aí eu tenho que passar aonde eu quero que essas migrações sejam criadas lembra lá na primeira aula quando a gente começou a criar essas coisas aqui a gente criou um lá no P Project lembra que a gente falou Olha eu não quero que olhe uma chamada migrations Então exclui ela daqui então é esse esquema aqui Exclui
essa coisa daqui migrations porque é o nome que eu pensei em dar para essa pasta Então vai chamar migrations massa com isso aqui ele falou ele deu uma uma mensagem que ele falou ó criando um diretório chamado fast zer migration e eu fiz errado né porque era migrations legal fiz de propósito mas é isso aqui ó ele tem o migration aí ele criou um versions e tudo mais o que que acontece se eu fizer isso aqui errado errei Então você dá um RM ou você vai lá no seu gerenciador de arquivos e Deleta a pastinha
migration daqui ó Isso aqui é uma coisa que dá muito pau eu já errei muitas vezes isso aqui só que aí tá vendo que você apaga a passa ele tem uma lambic aqui aí ele fica aqui ó script location tá vendo ele criou esse in na raiz do repositório E aí a gente del ele também massa se você tiver algum erro tá ligado disso aqui deleta o in também porque às vezes você Você erra aí você tenta criar de novo e aí ele faz essa inhaca E aí você tenta criar de novo ele fala que
já tá criado e aí tipo dá D dá dá um bug na mente então legal migrations no plural então ele criou o diretório migrations dentro de migrations tem uma coisa chamada versions vamos viajar aqui junto Ó tem o migrations dentro migrations tem o versions e aqui tem o env env é aonde tá a configuração da nossa migração ou seja olha olha isso aqui que bonito ele tá perguntando aqui ó target metadata ele tá aqui tipo assim adicione o os seus metadados de modelo para que a gente possa gerar uma migração Ou seja criar um estado
de tabelas então a gente precisa trazer o nosso metadata para cá que é o tem table registry tá vendo ele dá esse tipo de coisa então esse arquivo pon env Aqui é onde estão as configurações da migração e o maco que é esse arquivo aqui é o template de de de migrações não vou entrar nesse ponto tão fundo aqui mas ele pode ser feito isso aqui E esse arquivo alembic in é onde basicamente ele tem as configurações do alenic então tipo assim ah qual que é o RL do do banco de dados qual que Qual
que é o coisa que ele vai usar para logar aonde tá a pasta de migrações e todos esses pontos aqui então é é é isso aqui que ele criou então ele criou vários arquivos aqui o alembic in e essa pastinha chamada my gration pergunta se essas migrações apagam por erro tem como ser recuperada falando em caso de produção então A ideia é que você faça as migrações direito né tipo assim a a ideia da migração é que você Não faça esse tipo de de de nhaca Porque Nossa caiu alguma coisa da minha cadeira aqui é
que você não faça esse tipo de coisa a ideia dela é que você sabe tenha uma forma automatizada de reproduzir o o o que a migração fez tá ligado para que não tenha essas interferências manuais que fazem dar erro tipo assim pode dar erro Você pode escrever a migração errada pode mas a ideia é que você automatize para não ter esse tipo de de problema então legal o que que a gente vai fazer lá para configurar as migrações lá nesse arquivo env que a gente tem aqui então ele falou o seguinte olha aqui tem uma
configuração Tem várias coisas eu preciso falar para ele o seguinte que a configuração precisa passar o eu preciso falar Aonde está meu banco de dados né então que é uma coisa que a gente vai fazer aqui então ele fala ó config troca a operação tipo assim set a opção para falar olha a URL é o meu settings que foi aquilo que a gente tinha criado antes né então vamos lá então eu vou importar ele aqui então ah from Fast z0 P models Ah aqui não é models né ponto settings Import settings e eu vou falar
o seguinte para ele Ó config ponto set Main option S Main option E aí eu vou trocar uma opção aqui e eu vou falar olha SQL alkem P URL sqlalchemy.url E aí eu vou atribuir um novo valor para isso aqui que é o settings que foi aquela classe que a gente importou que a gente fez que sabe aonde tá a configuração do banco de dados então ponto Database URL simples assim então a partir daqui ele começa a funcionar com esses dois esquemas aqui então ele sabe aonde é o banco de dado que ele vai criar
[ __ ] é quando alteram direto no banco sim é É exatamente esse o problema tipo assim é por isso que existem as migrations né Maria Porque tipo se todo mundo fica mexendo na mão depois ninguém consegue reverter né É triste então a gente vai instanciar essa classe e vai pegar esse valor aqui e a outra coisa que a gente precisa alterar nesse config é passar o target metadata para para falar que a gente vai usar o metadata do registry aqui né então from Fast z0 ponto models Import table registry E aí nesse table registry
aqui a gente vai falar olha aqui onde tem essa linha target metadata eu vou passar ponto metadata são essas duas alterações que a gente precisa fazer esse context config aqui você vai ver gente mudando ele aqui ó porque ele tá no alback pin que ele fala aqui ó SQL alkem URL a gente tá sobrescrevendo daqui tem gente que muda nesse arquivo tem gente que muda lá eu prefiro mudar lá porque fica dinâmico aqui ainda fica preso dentro de um arquivo que é uma coisa que eu não recomendo para ninguém Então a partir disso aqui a
partir dessa coisa que a gente criou a gente vai criar nossa primeira versão do nosso banco de dados do curso inteiro e aí a gente vai fazer fazer isso aqui ó alambic revision revision é que a gente vai criar uma revisão e aí a gente vai falar que é auto generated né autogerada e o que quer dizer autogerada quer dizer que ele vai pegar ele vai ins inspecionar o que tem aqui dentro do metadata e vai criar uma versão do banco de dados a partir de como o nosso modelo está nesse exato momento sim é
muito complicado eu sei que é complicado então ele vai ler aqui falar olha Quais são as tabelas Quais são os campos Quais são os atributos e quais são os tipos e quais são aquelas coisas que a gente tem aqui então ele vai pegar aqui e vai a partir disso aqui no metadata vai autar isso aqui vamos ver o que que acontece aqui então vamos lá revision vamos criar uma versão massa legal a primeira versão era do Database igual a lista sim essa era a versão zero né Então deixa eu fazer isso aqui um pouco mais
para baixo pro comando não ficar então al revision revision menos menos aut eu eu sempre escrevo errado isso aqui autogenerate aut aut eu sempre escrev autogenerated eu não sei Por quê Eu sempre faço isso E aí eu vou passar uma mensagem aqui que é a a mensagem que diz o que está acontecendo isso aqui é tipo Git né é a mensagem do que a gente tá fazendo nessa migração o que que aconteceu aqui né daí eu falei ó Create users table então a gente tá criando a tabela de usuários então Create Create users table esses
comandos do Alem que a gente consegue automatizar com tesk P sim mas isso aqui você vai rodar só quando o banco de dados mudar eu não vejo sentido em automatizar isso aqui mas pode se você quiser rodei aqui legal aí ele deu um erro aqui ó tipo assim ó skl al argument error invalid SQL URL sqlite bar database.db por faltou uma barra é barra barra barra tá vendo ó eu mesmo Caio nas minhas armadilhas barra barra barra quer dizer no skite que ele é absoluto então ó tá vendo eu mesmo Caio nas armadilhas o legal
de Live code é isso porque dá erro tá ligado Então aqui ó faltou uma barra são três barras barra barra barra o migration do alic sim é é a mesma coisa é o mesmo conceito que ele aplica lá e aqui tipo assim são ferramentas diferentes que fazem a mesma coisa no Jungle O make migration aqui a gente a gente está realmente criando uma migração Então vamos lá agora acho que vai dar certo ah legal ó o que que ele escreveu aqui beleza ah a gente tá pegando tal tal tal aqui ó detected ou seja foi
detectado que uma tabela foi adicionada né E essa tabela se chama users E aí a partir disso aqui ele fez o seguinte ó generated generating ou seja ele tá gerando o código dentro lá do migrations versions lá dentro daquela daquela Pastinha massa e aí aqui ele criou aqui ó um ID Isso aqui vai mudar de PC para PC não vai ser igual ao meu e ele tem aqui ó Create users table que é o comentário que a gente adicionou na hora de gerar a mensagem se a gente for lá no código Olha que interessante vou
dar aqui ó deixa eu diminuir tem muita coisa aqui no meu editor aberta aqui então dentro da pastinha de migrations tem o versions e dentro do versions Ele criou essa coisa aqui e ele falou o seguinte olha revision identifiers used by almic então ele usou esse ID esse ID vai ser único para cada pessoa para cada migração E aí ele tá criando as instruções do banco de dados como se fosse o SQL aqui ó então ele vai fazer ó operação op de Operation Create table cria tabela users com a coluna ID que é do tipo
integer nullable false cria uma coluna username que é string nullable false password string tal tal tal created at que é um date time que ele usa lá do Servidor o current time stamp que é nullable false quem a chave primária e tudo mais Olha que legal então ele traduziu como criar a nossa tabela no sentido mais próximo que o código Python poderia ser do SQL Então sempre que a gente for avançar lembra que o banco de dados é evolutivo fala eu quero reproduzir o banco de dados dessa aplicação então ele vai executar essa função upgrade
e às vezes eu quero falar Tipo assim ô desfaz dessa operação que a gente fez e aí o downgrade dele é o drop table ou seja apaga a tabela porque no de cima a gente tá criando ela então se a gente quiser voltar para trás voltar para trás é um pleonasmo Mas se a gente quiser ir para trás andar no sentido contrário das migrações a gente vai deletar a tabela de users nota importante para quem for usar isso aqui em produção ele tem aqui ó commands autogenerated by Alec please adjust ou seja isso aqui foi
criado dentro do contexto automatizado pelo alend ajuste ou seja olha confere Toda vez você não tá fazendo caquinha que foi o que alguém falou ali tipo assim ah mas eu faço desse jeito aqui então tipo assim sabe Ah fizeram errado aqui tá ajustado e é isso aqui tipo assim pra gente tá tudo certo a gente conferiu é inteiro é string e tal date times tempo do Servidor e tudo mais Então a partir daqui a gente tá com tudo funcionando massa não entendi o p sim precisa ser adicionado a gente fez isso mais para trás na
aula então é esse esquema isso aqui é o que a gente chama de migração E aí toda a alteração que a gente for fazendo no no banco de dados a gente vai criando uma versão disso aqui um dos exercícios dessa aula é criar uma nova versão para isso aqui eu confio na alembic eu nunca nunca ajusto é cara já tive tantos erros em produção por não ajustar isso aqui ele cria tabela no banco para controlar essas migrations sim e é onde a gente vai chegar exatamente agora legal então ele fez esse esquema criou esses arquivos
novos a gente alterou as configurações precisavam ser feitas a gente gerou a migração E aí agora se a gente for olhar lá no banco de dados que a gente tinha eu vou atualizar ele aqui ó update você vai ver que ele criou aqui ó uma nova coisa Ele criou uma tabela chamada alambic version E aí ele tem aqui ó version Number e e ele não adicionou nada massa ele não adicionou nada tá tudo certo tá tudo ok ele só criou essa tabela para falar da versão da migração mas ele como ele não aplicou nenhuma migração
então não aconteceu nada é é exatamente como tá puro aqui e a gente precisa aplicar essas alterações no banco ou seja cria essa tabela com esses campos com esses atributos Com todas essas coisas então a gente faz o seguinte aamb up grade que é para subir sabe atualiza a versão do banco que a gente tá versionando nesse arquivo nos arquivos que estão dentro da pasta versions então alambic upgrade head alambic upgrade head E aí olha o que que aconteceu Ele falou ó beleza entramos no contexto do skq L que é o banco que a gente
tá usando e a gente vai fazer uma operação de ddl e ele rodou um upgrade para essa versão aqui que é esses as 0861 99 a c tipo assim que é que pode ser o do do teu vai ser outro número não vai ser esse ID aqui e aí agora a partir do momento que a gente for lá no banco e d um update ele tá aqui ó users olha que massa e não tem nada porque a ideia da migração é criar o esqueleto criar as tabelas os formatos e todas as coisas e aí ele
criou a lambic version aqui se a gente atualizar e vir aqui ele tá falando ó qual é a versão daig que rodando aqui dentro Provavelmente o valor que tá aqui é esse número específico aqui a t para quem não tem uma ferramenta dessa quer usar o funciona no Terminal 3 você passa database.db e a f quero ver oima que ele criou então chama esima el foua tabela tabela chamada users que tem essas propriedades aqui se você fizer um um select aqui select asterisco from AIC underline version você vai ver que ele criou ele tá nessa
versão específica A8 tal tal tal o skite se vocês quiserem instalar o cli essa coisa de mexer nele aqui lá no no no meio dessa aula aqui tem uma forma de como instalar ele em todos os sistemas operacionais S Lite aqui ó caso você não tenha o skq lite na máquina ele tá aqui ó como está lá no art no Deb no Mac no Windows e todas as instruções aqui se você quiser fazer isso aqui nesse momento para sair é quit é ponto quit é ponto quit massa legal então a gente criou a nossa primeira
versão de banco de dados e eu sei eu vou eu vou falar uma coisa aqui para vocês provavelmente vai dar erro quando vocês estiverem fazendo vai dar um monte de pane no sistema usa a nossa comunidade o grupo que tá aqui na descrição para tentar te ajudar e a gente vê o que funciona como funciona o que que precisa alterar massa vamos usar algo relacionado a Cid agora não mais paraa frente talvez massa e aí eu deixo vocês aqui com exercícios são três exercícios e todos eles são correlacionados para vocês poderem brincar e testar então
legal eu quero no exercício que vocês façam uma alteração no modelo sabe eu quero que vocês mudem a tabela user adicionando um campo chamado updated at então quando esse dado foi atualizado porque lembra que a gente cria aí quando a gente criar lá no método post ele vai preencher o created at mas quando a gente alterar lá no [ __ ] a gente vai ter que preencher esse campo updated at Então esse campo deve ser do tipo date time ele deve ter init false e o padrão deve ser Now que é o update funk Now
Então aqui tem as dicas de como fazer esse tipo de coisa aqui sei que vocês vão conseguir qualquer coisa tirem dúvidas lá no grupo a segunda parte desse exercício é criar uma nova migração autogerada com esse updated AD então aí vocês vão ver como é que funciona uma migração vocês vão tentar testar na mão vai dar errado é é divertido tem que aprender a fazer isso aqui aí vocês vão ver que é diferente porque não cria tabela cria um campo Sabe tem algumas coisas interessantes para aprender ali e o terceiro o terceiro exercício que é
a terceira parte desse exercício é aplicar essa migração no seu banco de dados ou seja você vai criar um novo Campo fazer uma nova migração autogerada e aplicar a migração no banco de dados Esse é o desafio dessa aula e o exercício e tal lembrando sempre que tem o quiz da aula e vocês podem também responder as coisas tem várias perguntas interessantes aqui eu sei que essa aula pode ter sido um pouco confusa porque essa aula tem muita coisa é tipo assim foi um escopo bem grande mas você pode ver rever e tudo mais e
tem as dicas né tipo assim se você tiver meio sabe insegura inseguro com as coisas aqui tem vários links de apoio na aula tá ligado Tipo assim ah caso nunca tenha trabalhado com migrações tem uma aula inteira de migrações aqui ah mas eu nunca trabalhei com s l alkim para mim foi meio confuso então tem uma aula inteira sobre skl alkem Ah mas eu não entendi esse negócio de isolar a configuração tal do 12 fatores tem uma aula inteira sobre 12 fatores Então aqui tem muitos links de referencia na aula e eles podem te ajudar
caso sai você Olhe isso aí e fala ih cara entendi nada então tem mais coisas aqui o material aqui é sempre complementar sempre ajuda então tem bastante coisa agora eu vou fazer meu Comet aqui né então Git add ponto eu vou dar a mesma mensagem que tinha aqui no texto que é tipo adicionada a primeira migração com a LM criada a tabela de usuários legal e Git push então minhas alterações já estão lá no repositório quem quiser ver é o fast Fast z0 S que é o meu repositório lá legal massa espero que vocês tenham
gostado tenham se divertido eu sei que isso aqui dá um pouco de trabalho é muita coisa por isso que eu pedi PR vocês darem uma olhada na Live sobre skl alkem antes e sobre AIC depois porque eu sei que isso dá uma confusão e tal eu entendo isso Me desculpe se teve explicação mas eu não vi porém entre os arquivos gerados na aula referente ao alic e toda pasta de migration o que deve ser versionado tudo isso aqui você sobe no Git tanto que eu dei um Git AD ponto as migrações TM que estar no
repositório o que não é para T arquivo. en e o arquivo e o Database de resto tudo é para tá lá warning aqui ó isso aqui mano de a finalização da linha O Mateus novoa tá no Windows eu tenho certeza e você configurou na hora de configurar o Git você deu next next next next next next não é verdade então tem uma configuração do Git que você converte os arquivos entre entre tipos em LF crlf tem uma configuração depois a gente conversa no grupo se precisar mudar essa configuração massa bom a gente se vê na
quinta-feira e na quinta-feira a gente vai isso aqui no banco de dados né a gente fez esse esquema né brincou pegou o o esquema do banco criamos a tabela fizemos as coisas na próxima aula a gente vai pegar isso aqui e juntar na api a gente vai tirar aquele Database que é uma lista e vai começar a juntar todas essas coisas né então vai pegar essas tabelas juntar ela com os esquemas do ptic e começar a atualizar o banco de dados enquanto a gente tiver criando users mandando requests para api que é a parte interessante
da aula né tipo assim que foi para que a gente veio né mas tem sempre conceitos que a gente precisa entender antes então Obrigado um beijo para vocês e a gente se vê na próxima aula juntando isso aqui com o código do fash API beijão para vocês e até mais tchauzinho