Other Languages Moderators Popular Post Lord Henry Posted October 16, 2018 Other Languages Moderators Popular Post Share Posted October 16, 2018 (edited) O que é? Pra que serve? Um banco de dados é onde ficam salvos diversos tipos de dados que são usados entre as sessões dos jogadores e do servidor, isto significa que mesmo se o jogador relogar no servidor ou até mesmo o servidor reiniciar, os dados salvos no banco de dados não são perdidos. (se o script que salvou lá foi feito corretamente). O que posso salvar neles? O MTA já cria 2 bancos de dados padrão quando vc cria seu servidor, são eles: internal.db - Onde são salvos todos os dados das contas dos jogadores, login, senha, grana do bolso, posição do jogador quando deslogou, vida, colete, skin, armas, munição, etc. registry.db - Onde são salvos todos os dados que são utilizados pelos resources, como por exemplo melhores pontuações das corridas (race gamemode), proprietários das casas, dados bancários dos jogadores, saldo bancário dos jogadores, carros comprados pelos jogadores, roupas compradas pelos jogadores, empresas adquiridas pelos jogadores, etc. Onde eles estão? Estes dois bancos de dados estão na pasta deathmatch do seu servidor, estão na linguagem SQLite. Você ainda pode criar outros bancos de dados externos, para serem usados pelos resources, mas na minha opinião isso não é recomendável, uma vez que vc usaria MySQL, que é mais complexo e exige certos cuidados de acesso e domínio, mas alguns servidores profissionais precisam fazer assim pois fizeram os bancos de dados ficarem fora do servidor em outro IP por segurança, dai é necessário ter bancos de dados externos. Nesse tutorial vamos tratar somente dos bancos de dados nativos do MTA, por serem mais fáceis de entender. Como mexo neles? Para salvar alguma coisa na conta do jogador, isto é, no internal.db, você usa setAccountData, e para obter esses dados depois, use getAccountData. É extremamente simples, funciona da mesma forma que um setElementData, mas em vez de salvar uma data temporária em um elemento, salva uma data permanente numa conta. Porém, para salvar alguma coisa no registry.db, é um pouco mais complicado, uma vez que vc vai precisar criar uma tabela nova para cada resource. Por exemplo, vc acabou de criar um resource de ranking por kills/deaths e você deseja salvar esse ranking no banco de dados para que ao reiniciar o resource ou o servidor, o ranking não seja perdido. Para isso vc vai precisar primeiramente criar uma tabela no banco de dados registry.db, essa tabela será acessada pelo resource, que irá salvar os dados dele lá. Para fazer qualquer coisa neste banco de dados (criar tabelas, inserir, alterar, remover, deletar, inserir colunas em determinada tabela, etc) vc vai precisar usar isso: executeSQLQuery. Aqui, será necessário conhecimento em SQL para fazer isso, mas é mais fácil do que aprender uma linguagem de programação nova, pois suas opções e sintaxes são menores do que uma linguagem inteira de programação, você não vai inventar nenhum sistema novo aqui, apenas criar e gerenciar tabelas e dados. Criar tabela nova no banco de dados: (o Caps Lock não é uma regra, mas é melhor para entender o que é código e o que é nome)[Os seguintes códigos só funcionam server-side] executeSQLQuery ("CREATE TABLE IF NOT EXISTS nomedatabela (nomecoluna1 TEXT, nomecoluna2 REAL, nomecoluna3 INTEGER)") TEXT = Valores desta coluna serão textos. Podem ter símbolos, números e espaços. REAL = Valores desta coluna serão numéricos reais. (números decimais, positivos, negativos e 0.0) INTEGER = Valores desta coluna serão numéricos inteiros. (positivos, negativos e 0) (não existe tipo BOOLEAN, use TEXT e insira valor "false" ou "true") (existe valor NULL, é diferente de vazio e diferente de 0. NULL significa ausência de dados. O NULL aparece quando você cria uma linha ou coluna nova sem atribuir valores a elas.) Deletar tabela do banco de dados: executeSQLQuery ("DROP TABLE nomedatabela") Todas as linhas, colunas, células e valores desta tabela são deletados junto. Deletar linhas da tabela: (as células não ficarão NULL) executeSQLQuery ("DELETE FROM nomedatabela WHERE colunaespecífica=?", valorDaCelulaEspecifica) O ? indica que o valor está após a declaração do SQL. Você poderia colocar o valor direto no lugar do ?. Mas por alguma razão, as vezes isso gera erro. Além disso, se o valor da célula estiver em uma variável no seu script, você não pode declarar a variável no lugar do ?. Ali só pode ser o valor direto, pois a declaração SQL inteira se trata de uma string. Por isso o uso do ?, que está recebendo o valor da variável que está depois da vírgula. Obs: Para verificar se uma célula tem valor nulo, não se usa os operadores lógicos de ==, <= >=. Para isso, usa-se IS NULL ou IS NOT NULL. Ex: executeSQLQuery ("DELETE nomecoluna1,nomecoluna2 FROM nomedatabela WHERE nomecoluna3 IS NULL") Isso vai deletar todas as células da coluna 1 e coluna 2 onde a coluna 3 tem uma célula de valor NULL. Se a coluna 3 não tiver nenhuma célula de valor NULL, nada acontece. Inserir nova linha de valores: (ele vai criar automaticamente uma nova linha com novas células) executeSQLQuery ("INSERT INTO nomedatabela(nomecoluna1,nomecoluna2,nomecoluna3) VALUES(?,?,?)", valorCelulaColuna1, valorCelulaColuna2, valorCelulaColuna3) Neste caso, ele está inserindo 3 novos valores, cada valor em uma coluna. Se você não declarar os nomes das colunas, ele vai preencher na ordem das colunas automaticamente. Você pode deixar de declarar uma coluna se não quiser atribuir valor na célula daquela coluna. Se o tipo de valor da variável não for do tipo de dado daquela coluna, dará erro. Atualizar valores de células que já existem em uma tabela: (não é possível alterar os tipos de valores, é necessário editar o tipo da coluna se quiser fazer isso) executeSQLQuery ("UPDATE nomedatabela SET nomecoluna2=?,nomecoluna3=? WHERE nomecoluna1=?", valorCelulaColuna2, valorCelulaColuna3, valorCelulaColuna1) No caso acima, ele vai atualizar as células das colunas 2 e 3 onde o valor da célula da coluna 1 for igual ao valor de valorColunaCelula1.OBS: Nada impede que você coloque as primeiras variáveis junto à declaração SQL, mas para fazer isso você deve "cortar" a string, inserir as variáveis e depois continuar a string, Ex: executeSQLQuery ("UPDATE nomedatabela SET nomecoluna2= '".. valorCelulaColuna2 .."',nomecoluna3='".. valorCelulaColuna2 .."' WHERE nomecoluna1=?", valorCelulaColuna1) Lembrando que o valor destas variáveis também são strings na declaração, portanto use aspas simples antes e depois de cada corte para transformar os valores em string. Os dois pontos (..) significam que estes valores fazem parte do argumento SQL. Da mesma forma, se vc usar "1" .. "1", será igual a "11". (Por isso acho muito mais fácil deixar tudo ? na declaração SQL e colocar as variáveis todas após a string.) Selecionar determinadas células da tabela: (usado geralmente para obter os valores destas células para usar no script, você pode selecionar somente 1 célula ou várias) executeSQLQuery ("SELECT nomecoluna1,nomecoluna2 FROM nomedatabela WHERE nomecoluna3=?", valorCelulaColuna3) Neste exemplo, ele vai selecionar a célula da coluna 1 e a célula da coluna 2, na linha onde a célula da coluna 3 for igual a valorCelulaColuna3. Alterar a tabela (adicionar coluna nova) [SQLite não suporta deletar coluna nem editar tipo de coluna] executeSQLQuery ("ALTER TABLE nomedatabela ADD nomecoluna4 REAL") Devido a limitações do SQLite, ALTER TABLE não pode ser usado para deletar uma coluna nem para editar seu tipo. Para fazer isso é necessário recriar a tabela inteira com as novas alterações. No exemplo acima, ele vai adicionar uma nova coluna chamada "nomecoluna4". Tá, mas como ficaria tudo isso dentro de um script? Fiz um código com vários testes de banco de dados. Cada comando faz alguma coisa. Spoiler addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), function() executeSQLQuery ("CREATE TABLE IF NOT EXISTS tabelaLegal (ID INTEGER NOT NULL PRIMARY KEY, PosX REAL, PosY REAL, PosZ REAL, accountName TEXT)") print ("Table created.") -- Manda isso no /debugscript 3, só para testes. end) -- Cria uma tabela chamada "tabelaLegal" no banco de dados registry.db, com as colunas "ID", "PosX", "PosY", "PosZ", "accountName". Onde a coluna ID irá se preencher automaticamente com o ID anterior +1. addCommandHandler ("add", function(player, cmd, val1, val2) -- Use /add 2.2 teste123 if not val2 then print ("Erro: Faltaram parâmetros.") return end executeSQLQuery ("INSERT INTO tabelaLegal(PosX,accountName) VALUES(?,?)", val1, val2) print ("Valores novos adicionados na tabela.") -- Adiciona uma linha de células com os valores informados nas colunas PosX e accountName. As demais células da linha serão NULL e a célula da coluna ID recebe o ID da linha anterior + 1. end) addCommandHandler ("addall", function(player, cmd, val1, val2, val3, val4) if not val4 then print ("Erro: Faltaram parâmetros.") return end executeSQLQuery ("INSERT INTO tabelaLegal VALUES(NULL,?,?,?,?)", val1, val2, val3, val4) -- No caso, as colunas não foram informadas, então ele vai preencher cada uma em ordem. print ("Linha inteira adicionada na tabela.") -- Adiciona uma linha de células com os valores informados na ordem das colunas. end) addCommandHandler ("addrestored", function() local registros = executeSQLQuery ("SELECT * FROM tabelaLegal") -- Seleciona a tabela inteira. for i=1, #registros do -- #registros é o número de linhas da tabela. local result = executeSQLQuery ("SELECT ID FROM tabelaLegal WHERE ID=?", i) if(#result == 0) then -- O #result é quantos IDs = i foram encontrados. executeSQLQuery ("INSERT INTO tabelaLegal VALUES(?,NULL,NULL,NULL,NULL)", i) -- Cria uma nova linha com o ID perdido, com valores nulos. print ("ID "..i.." restaurado com valores nulos.") end end -- Se não existe nenhum ID perdido, nada acontece. Os IDs não precisam estar necessariamente em ordem. end) -- Para testar isso, crie 2 linhas. Depois delete a primeira linha. addCommandHandler ("del", function(player, cmd, numero) if not numero then print ("Erro: Faltou parâmetro.") return end executeSQLQuery ("DELETE FROM tabelaLegal WHERE ID=?", numero) print ("A linha inteira do ID "..numero.." foi deletada da tabela.") -- Deleta a linha onde a coluna ID tem o valor informado. Se vc quer apenas apagar os dados da linha sem deletar as células, preencha-as com vazio em vez disso. end) addCommandHandler ("delnull", function() executeSQLQuery ("DELETE FROM tabelaLegal WHERE accountName IS NULL") print ("A linha nula foi deletada da tabela.") -- Deleta a linha onde a coluna accountName tem célula de valor NULL. Se mais de uma linha possuir accountName de valor NULL, ele vai deletar também. end) addCommandHandler ("delall", function() executeSQLQuery ("DELETE FROM tabelaLegal") print ("A tabela foi limpada.") -- Deleta tudo da tabela, mas mantém as colunas. end) addCommandHandler ("deltable", function() executeSQLQuery ("DROP TABLE tabelaLegal") print ("A tabela inteira foi deletada.") -- Deleta a tabela inteira, incluindo suas colunas, linhas, células e dados. end) addCommandHandler ("size", function() local registros = executeSQLQuery ("SELECT * FROM tabelaLegal") print ("Existem atualmente "..#registros.." registros na tabela.") -- Mostra quantas linhas existem na tabela. end) addCommandHandler ("edit", function(player, cmd, id, val1, val2, val3, val4) -- Tente /edit 1 11 22 33 44 executeSQLQuery ("UPDATE tabelaLegal SET PosX=?,PosY=?,PosZ=?,accountName=? WHERE ID=?", val1, val2, val3, val4, id) print ("O registro "..id.." foi atualizado.") -- Atualiza os registros do ID específico com os valores específicos. print ("PosX: "..val1) print ("PosY: "..val2) print ("PosZ: "..val3) print ("accountName: "..val4) end) addCommandHandler ("editempty", function(player, cmd, id) executeSQLQuery ("UPDATE tabelaLegal SET PosX=?,PosY=?,PosZ=?,accountName=? WHERE ID=?", "", "", "", "", id) print ("O registro "..id.." foi limpado.") -- Deixa todos os registros do ID específico vazios. end) addCommandHandler ("coluna", function() executeSQLQuery ("ALTER TABLE tabelaLegal ADD colunaQualquer TEXT") print ("Coluna adicionada.") -- Adiciona uma coluna chamada "colunaQualquer" na tabela. end) É possível mexer em um banco de dados manualmente sem usar scripts? Sim, é possível. Eu mesmo costumo fazer isso para corrigir algumas coisas rápidas sem precisar programar mais nada. Para poder abrir os bancos de dados (internal.db e registry.db) você deve usar um programa chamado DB Browser for SQLite. Um programa gratuito, leve e bem fácil de entender. Nele você consegue acessar todas as tabelas do banco de dados e editar os valores como se fosse em uma planilha do Excel. Basta ir na aba Navegar dados, selecionar a tabela que deseja modificar, clicar em cima da célula cujo valor deseja atualizar, digitar o novo valor, clicar em Aplicar e depois clicar em Escrever modificações (salvar banco de dados). Pronto! E tem mais! Se você já tiver conhecimento avançado com a linguagem SQL, você também pode fazer alterações avançadas via código dentro do programa. Basta acessar a aba Executar SQL, escrever o comando SQL corretamente e depois clicar no botão de Play. Espero ter ajudado. Edited March 10, 2019 by Lord Henry Adicionadas informações sobre o DB Browser 4 12 Link to comment
#RooTs Posted October 18, 2018 Share Posted October 18, 2018 bela iniciativa... com um tempo extra irei ler isso com mais atenção Link to comment
Vazern Posted November 28, 2018 Share Posted November 28, 2018 Ótimo tutorial amigo! Me ajudou muito, obrigado. Link to comment
biLLs Posted December 4, 2018 Share Posted December 4, 2018 parabéns lord. Uma parada que eu não sabia era o IS NOT NULL. showw tirou onda Link to comment
LeeaF Posted May 14, 2019 Share Posted May 14, 2019 On 16/10/2018 at 12:29, Lord Henry said: Lord, estou editando um whitelist que peguei daqui mesmo para meu servidor, porém tem um tal "database.sql" e nas anotações da resorce pede pra eu colocar ele no Banco de dados, mas não sei onde é e como upo. Pode me ajudar?? Link to comment
Other Languages Moderators Lord Henry Posted May 14, 2019 Author Other Languages Moderators Share Posted May 14, 2019 (edited) Arquivo.sql não é um tipo de arquivo nativo do MTA. O que tem dentro dele? Edited May 14, 2019 by Lord Henry 1 Link to comment
LeeaF Posted May 15, 2019 Share Posted May 15, 2019 7 hours ago, Lord Henry said: Arquivo.sql não é um tipo de arquivo nativo do MTA. O que tem dentro dele? Durante a tarde vi um tutorial gringo e disseram que era só eu criar um banco de dados no MySQL, baixar 2 dll (libmysql e outra q ainda nn baixei) e importar pro banco de dados a file database.sql do script, beleza, mas agora ele faz a ligação com o MySQL mas não está impedindo eu de me conectar mesmo não estando na whitelist ;-; creio que seja o lua, veja ai pra mim pfvr se tem algo errado (traduzi boa parte do script que estava em alemão) dbhandler = dbConnect( "mysql", "dbname=whitelist;host=127.0.0.1", "whitelist", "senha", "autoreconnect=1" ) if not (dbHandler) then outputDebugString("Não é possível conectar-se ao banco de dados MySQL!",3) outputServerLog("Não é possível conectar-se ao banco de dados MySQL!") dbhandler = dbConnect( "mysql", "dbname=whitelist;host=local", "whitelist", "senha", "autoreconnect=1" ) if not (dbhandler) then outputDebugString("Não foi possível se conectar!",3) outputServerLog("Não foi possível se conectar!") stopResource(getThisResource()) else outputDebugString("Conexão MySQL feita!",3) end else outputDebugString("Conexão MySQL feita!",3) end addEventHandler("onPlayerConnect",getRootElement(), function(playerNick,playerIP,playerUsername,playerSerial) local qh = dbQuery(dbhandler,"SELECT * FROM whitelist WHERE Serial=?", playerSerial) local result,irow = dbPoll(qh,-1) if irow > 0 then outputDebugString(playerNick.." sucess!",3) outputServerLog(playerNick.." sucess!") else cancelEvent(true,"Registre-se na whitelist: discord.me/vmrbeta") end end) addCommandHandler("addwhitelist", function(player,cmd,name,serial) local accname = getAccountName(getPlayerAccount(player)) if isObjectInACLGroup ( "user."..accname, aclGetGroup ( "Admin" ) ) then if (name) and (serial) then dbExec(dbhandler, "INSERT INTO whitelist (NAME, Serial) VALUES ('"..name.."', '"..serial.."');") outputChatBox("Added "..name.." "..serial.." to whitelist",player,0,255,0) else outputChatBox("The correct Syntax is /addwhitelist name serial",player,255,0,0) end else outputChatBox("You are not an admin!",player,255,0,0) end end) Link to comment
[M]ister Posted May 15, 2019 Share Posted May 15, 2019 (edited) Se eu fosse você, adaptaria o script para ao invés de utilizar MySQL usar o SQLite do MTA Troque sua primeira linha por isso: dbhandler = dbConnect ("sqlite", "whitelist.db") Em relação ao seu arquivo database.sql, provavelmente existe a criação da tabela do whitelist, copie o código dele e rode com dbExec Exemplo: dbExec (dbhandler, "CREATE TABLE IF NOT EXISTS WHITELIST …") @LeeaF você deveria ter criado um tópico novo com sua dúvida, pois o assunto não se relaciona com o tutorial deste tópico. Edited May 15, 2019 by MaligNos Link to comment
Other Languages Moderators Lord Henry Posted May 15, 2019 Author Other Languages Moderators Share Posted May 15, 2019 (edited) Pois é. Vcs estão usando funções MySQL, este tutorial é só de SQLite, banco de dados nativo do MTA. ExecuteSQLQuery Edited May 15, 2019 by Lord Henry 1 Link to comment
ajobr Posted June 17, 2020 Share Posted June 17, 2020 só n entendi onde ponho esses códigos e como, pois fui tentar abrir um arquivo .db e só haviam números... Logo estou em dúvida se esses comandos eu coloco-os junto do script que quero que salve ou separado e se for separado como faço a conexão entre o database e o script. Estou com essas dúvidas pois tenho um script de concessionaria em que tem esses comandos no código (porém não funciona). E tenho um arquivo .db, que funciona através de um arquivo Lua e um meta. Então acabei por ficar confuso, porque não sei se tenho de fazer isso dentro do script ou fora como no meu arquivo .db ... Se alguém puder me explicar agradeço desde já Link to comment
Gaimo Posted July 23, 2020 Share Posted July 23, 2020 Uma dúvida, eu rodo isso aqui e da um erro, depois eu rodo novamente e funciona por que ? executeSQLQuery("CREATE TABLE IF NOT EXISTS dealership (id INTEGER NOT NULL UNIQUE PRIMARY KEY AUTOINCREMENT, owner INTEGER, model INTEGER, health REAL, position TEXT, color TEXT, headlight TEXT, upgrades TEXT, for_sale TEXT, price INTEGER)") erro no debug: Database query failed: SQL logic error Mas quando do restart no resource ele cria o banco de dados e funciona perfeitamente. É só a primeira vez quando não existe o banco de dados que ele dá esse erro. Link to comment
ajobr Posted August 1, 2020 Share Posted August 1, 2020 On 22/07/2020 at 22:33, Gaimo said: Uma dúvida, eu rodo isso aqui e da um erro, depois eu rodo novamente e funciona por que ? executeSQLQuery("CREATE TABLE IF NOT EXISTS dealership (id INTEGER NOT NULL UNIQUE PRIMARY KEY AUTOINCREMENT, owner INTEGER, model INTEGER, health REAL, position TEXT, color TEXT, headlight TEXT, upgrades TEXT, for_sale TEXT, price INTEGER)") erro no debug: Database query failed: SQL logic error Mas quando do restart no resource ele cria o banco de dados e funciona perfeitamente. É só a primeira vez quando não existe o banco de dados que ele dá esse erro. Deve ser porque não existe nenhum banco de dados Link to comment
Gaimo Posted September 24, 2020 Share Posted September 24, 2020 Alguém conhece algum programa parecido com sqlitebrowser mas que acesse remotamente? No caso preciso acessar o banco de dados que está na HOST e se eu edito pelo filezilla a alteração não acontece somente via script. Link to comment
Boechat Posted January 14, 2021 Share Posted January 14, 2021 On 16/10/2018 at 12:29, Lord Henry said: O que é? Pra que serve? Um banco de dados é onde ficam salvos diversos tipos de dados que são usados entre as sessões dos jogadores e do servidor, isto significa que mesmo se o jogador relogar no servidor ou até mesmo o servidor reiniciar, os dados salvos no banco de dados não são perdidos. (se o script que salvou lá foi feito corretamente). O que posso salvar neles? O MTA já cria 2 bancos de dados padrão quando vc cria seu servidor, são eles: internal.db - Onde são salvos todos os dados das contas dos jogadores, login, senha, grana do bolso, posição do jogador quando deslogou, vida, colete, skin, armas, munição, etc. registry.db - Onde são salvos todos os dados que são utilizados pelos resources, como por exemplo melhores pontuações das corridas (race gamemode), proprietários das casas, dados bancários dos jogadores, saldo bancário dos jogadores, carros comprados pelos jogadores, roupas compradas pelos jogadores, empresas adquiridas pelos jogadores, etc. Onde eles estão? Estes dois bancos de dados estão na pasta deathmatch do seu servidor, estão na linguagem SQLite. Você ainda pode criar outros bancos de dados externos, para serem usados pelos resources, mas na minha opinião isso não é recomendável, uma vez que vc usaria MySQL, que é mais complexo e exige certos cuidados de acesso e domínio, mas alguns servidores profissionais precisam fazer assim pois fizeram os bancos de dados ficarem fora do servidor em outro IP por segurança, dai é necessário ter bancos de dados externos. Nesse tutorial vamos tratar somente dos bancos de dados nativos do MTA, por serem mais fáceis de entender. Como mexo neles? Para salvar alguma coisa na conta do jogador, isto é, no internal.db, você usa setAccountData, e para obter esses dados depois, use getAccountData. É extremamente simples, funciona da mesma forma que um setElementData, mas em vez de salvar uma data temporária em um elemento, salva uma data permanente numa conta. Porém, para salvar alguma coisa no registry.db, é um pouco mais complicado, uma vez que vc vai precisar criar uma tabela nova para cada resource. Por exemplo, vc acabou de criar um resource de ranking por kills/deaths e você deseja salvar esse ranking no banco de dados para que ao reiniciar o resource ou o servidor, o ranking não seja perdido. Para isso vc vai precisar primeiramente criar uma tabela no banco de dados registry.db, essa tabela será acessada pelo resource, que irá salvar os dados dele lá. Para fazer qualquer coisa neste banco de dados (criar tabelas, inserir, alterar, remover, deletar, inserir colunas em determinada tabela, etc) vc vai precisar usar isso: executeSQLQuery. Aqui, será necessário conhecimento em SQL para fazer isso, mas é mais fácil do que aprender uma linguagem de programação nova, pois suas opções e sintaxes são menores do que uma linguagem inteira de programação, você não vai inventar nenhum sistema novo aqui, apenas criar e gerenciar tabelas e dados. Criar tabela nova no banco de dados: (o Caps Lock não é uma regra, mas é melhor para entender o que é código e o que é nome) [Os seguintes códigos só funcionam server-side] executeSQLQuery ("CREATE TABLE IF NOT EXISTS nomedatabela (nomecoluna1 TEXT, nomecoluna2 REAL, nomecoluna3 INTEGER)") TEXT = Valores desta coluna serão textos. Podem ter símbolos, números e espaços. REAL = Valores desta coluna serão numéricos reais. (números decimais, positivos, negativos e 0.0) INTEGER = Valores desta coluna serão numéricos inteiros. (positivos, negativos e 0) (não existe tipo BOOLEAN, use TEXT e insira valor "false" ou "true") (existe valor NULL, é diferente de vazio e diferente de 0. NULL significa ausência de dados. O NULL aparece quando você cria uma linha ou coluna nova sem atribuir valores a elas.) Deletar tabela do banco de dados: executeSQLQuery ("DROP TABLE nomedatabela") Todas as linhas, colunas, células e valores desta tabela são deletados junto. Deletar linhas da tabela: (as células não ficarão NULL) executeSQLQuery ("DELETE FROM nomedatabela WHERE colunaespecífica=?", valorDaCelulaEspecifica) O ? indica que o valor está após a declaração do SQL. Você poderia colocar o valor direto no lugar do ?. Mas por alguma razão, as vezes isso gera erro. Além disso, se o valor da célula estiver em uma variável no seu script, você não pode declarar a variável no lugar do ?. Ali só pode ser o valor direto, pois a declaração SQL inteira se trata de uma string. Por isso o uso do ?, que está recebendo o valor da variável que está depois da vírgula. Obs: Para verificar se uma célula tem valor nulo, não se usa os operadores lógicos de ==, <= >=. Para isso, usa-se IS NULL ou IS NOT NULL. Ex: executeSQLQuery ("DELETE nomecoluna1,nomecoluna2 FROM nomedatabela WHERE nomecoluna3 IS NULL") Isso vai deletar todas as células da coluna 1 e coluna 2 onde a coluna 3 tem uma célula de valor NULL. Se a coluna 3 não tiver nenhuma célula de valor NULL, nada acontece. Inserir nova linha de valores: (ele vai criar automaticamente uma nova linha com novas células) executeSQLQuery ("INSERT INTO nomedatabela(nomecoluna1,nomecoluna2,nomecoluna3) VALUES(?,?,?)", valorCelulaColuna1, valorCelulaColuna2, valorCelulaColuna3) Neste caso, ele está inserindo 3 novos valores, cada valor em uma coluna. Se você não declarar os nomes das colunas, ele vai preencher na ordem das colunas automaticamente. Você pode deixar de declarar uma coluna se não quiser atribuir valor na célula daquela coluna. Se o tipo de valor da variável não for do tipo de dado daquela coluna, dará erro. Atualizar valores de células que já existem em uma tabela: (não é possível alterar os tipos de valores, é necessário editar o tipo da coluna se quiser fazer isso) executeSQLQuery ("UPDATE nomedatabela SET nomecoluna2=?,nomecoluna3=? WHERE nomecoluna1=?", valorCelulaColuna2, valorCelulaColuna3, valorCelulaColuna1) No caso acima, ele vai atualizar as células das colunas 2 e 3 onde o valor da célula da coluna 1 for igual ao valor de valorColunaCelula1. OBS: Nada impede que você coloque as primeiras variáveis junto à declaração SQL, mas para fazer isso você deve "cortar" a string, inserir as variáveis e depois continuar a string, Ex: executeSQLQuery ("UPDATE nomedatabela SET nomecoluna2= '".. valorCelulaColuna2 .."',nomecoluna3='".. valorCelulaColuna2 .."' WHERE nomecoluna1=?", valorCelulaColuna1) Lembrando que o valor destas variáveis também são strings na declaração, portanto use aspas simples antes e depois de cada corte para transformar os valores em string. Os dois pontos (..) significam que estes valores fazem parte do argumento SQL. Da mesma forma, se vc usar "1" .. "1", será igual a "11". (Por isso acho muito mais fácil deixar tudo ? na declaração SQL e colocar as variáveis todas após a string.) Selecionar determinadas células da tabela: (usado geralmente para obter os valores destas células para usar no script, você pode selecionar somente 1 célula ou várias) executeSQLQuery ("SELECT nomecoluna1,nomecoluna2 FROM nomedatabela WHERE nomecoluna3=?", valorCelulaColuna3) Neste exemplo, ele vai selecionar a célula da coluna 1 e a célula da coluna 2, na linha onde a célula da coluna 3 for igual a valorCelulaColuna3. Alterar a tabela (adicionar coluna nova) [SQLite não suporta deletar coluna nem editar tipo de coluna] executeSQLQuery ("ALTER TABLE nomedatabela ADD nomecoluna4 REAL") Devido a limitações do SQLite, ALTER TABLE não pode ser usado para deletar uma coluna nem para editar seu tipo. Para fazer isso é necessário recriar a tabela inteira com as novas alterações. No exemplo acima, ele vai adicionar uma nova coluna chamada "nomecoluna4". Tá, mas como ficaria tudo isso dentro de um script? Fiz um código com vários testes de banco de dados. Cada comando faz alguma coisa. Reveal hidden contents addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), function() executeSQLQuery ("CREATE TABLE IF NOT EXISTS tabelaLegal (ID INTEGER NOT NULL PRIMARY KEY, PosX REAL, PosY REAL, PosZ REAL, accountName TEXT)") print ("Table created.") -- Manda isso no /debugscript 3, só para testes. end) -- Cria uma tabela chamada "tabelaLegal" no banco de dados registry.db, com as colunas "ID", "PosX", "PosY", "PosZ", "accountName". Onde a coluna ID irá se preencher automaticamente com o ID anterior +1. addCommandHandler ("add", function(player, cmd, val1, val2) -- Use /add 2.2 teste123 if not val2 then print ("Erro: Faltaram parâmetros.") return end executeSQLQuery ("INSERT INTO tabelaLegal(PosX,accountName) VALUES(?,?)", val1, val2) print ("Valores novos adicionados na tabela.") -- Adiciona uma linha de células com os valores informados nas colunas PosX e accountName. As demais células da linha serão NULL e a célula da coluna ID recebe o ID da linha anterior + 1. end) addCommandHandler ("addall", function(player, cmd, val1, val2, val3, val4) if not val4 then print ("Erro: Faltaram parâmetros.") return end executeSQLQuery ("INSERT INTO tabelaLegal VALUES(NULL,?,?,?,?)", val1, val2, val3, val4) -- No caso, as colunas não foram informadas, então ele vai preencher cada uma em ordem. print ("Linha inteira adicionada na tabela.") -- Adiciona uma linha de células com os valores informados na ordem das colunas. end) addCommandHandler ("addrestored", function() local registros = executeSQLQuery ("SELECT * FROM tabelaLegal") -- Seleciona a tabela inteira. for i=1, #registros do -- #registros é o número de linhas da tabela. local result = executeSQLQuery ("SELECT ID FROM tabelaLegal WHERE ID=?", i) if(#result == 0) then -- O #result é quantos IDs = i foram encontrados. executeSQLQuery ("INSERT INTO tabelaLegal VALUES(?,NULL,NULL,NULL,NULL)", i) -- Cria uma nova linha com o ID perdido, com valores nulos. print ("ID "..i.." restaurado com valores nulos.") end end -- Se não existe nenhum ID perdido, nada acontece. Os IDs não precisam estar necessariamente em ordem. end) -- Para testar isso, crie 2 linhas. Depois delete a primeira linha. addCommandHandler ("del", function(player, cmd, numero) if not numero then print ("Erro: Faltou parâmetro.") return end executeSQLQuery ("DELETE FROM tabelaLegal WHERE ID=?", numero) print ("A linha inteira do ID "..numero.." foi deletada da tabela.") -- Deleta a linha onde a coluna ID tem o valor informado. Se vc quer apenas apagar os dados da linha sem deletar as células, preencha-as com vazio em vez disso. end) addCommandHandler ("delnull", function() executeSQLQuery ("DELETE FROM tabelaLegal WHERE accountName IS NULL") print ("A linha nula foi deletada da tabela.") -- Deleta a linha onde a coluna accountName tem célula de valor NULL. Se mais de uma linha possuir accountName de valor NULL, ele vai deletar também. end) addCommandHandler ("delall", function() executeSQLQuery ("DELETE FROM tabelaLegal") print ("A tabela foi limpada.") -- Deleta tudo da tabela, mas mantém as colunas. end) addCommandHandler ("deltable", function() executeSQLQuery ("DROP TABLE tabelaLegal") print ("A tabela inteira foi deletada.") -- Deleta a tabela inteira, incluindo suas colunas, linhas, células e dados. end) addCommandHandler ("size", function() local registros = executeSQLQuery ("SELECT * FROM tabelaLegal") print ("Existem atualmente "..#registros.." registros na tabela.") -- Mostra quantas linhas existem na tabela. end) addCommandHandler ("edit", function(player, cmd, id, val1, val2, val3, val4) -- Tente /edit 1 11 22 33 44 executeSQLQuery ("UPDATE tabelaLegal SET PosX=?,PosY=?,PosZ=?,accountName=? WHERE ID=?", val1, val2, val3, val4, id) print ("O registro "..id.." foi atualizado.") -- Atualiza os registros do ID específico com os valores específicos. print ("PosX: "..val1) print ("PosY: "..val2) print ("PosZ: "..val3) print ("accountName: "..val4) end) addCommandHandler ("editempty", function(player, cmd, id) executeSQLQuery ("UPDATE tabelaLegal SET PosX=?,PosY=?,PosZ=?,accountName=? WHERE ID=?", "", "", "", "", id) print ("O registro "..id.." foi limpado.") -- Deixa todos os registros do ID específico vazios. end) addCommandHandler ("coluna", function() executeSQLQuery ("ALTER TABLE tabelaLegal ADD colunaQualquer TEXT") print ("Coluna adicionada.") -- Adiciona uma coluna chamada "colunaQualquer" na tabela. end) É possível mexer em um banco de dados manualmente sem usar scripts? Sim, é possível. Eu mesmo costumo fazer isso para corrigir algumas coisas rápidas sem precisar programar mais nada. Para poder abrir os bancos de dados (internal.db e registry.db) você deve usar um programa chamado DB Browser for SQLite. Um programa gratuito, leve e bem fácil de entender. Nele você consegue acessar todas as tabelas do banco de dados e editar os valores como se fosse em uma planilha do Excel. Basta ir na aba Navegar dados, selecionar a tabela que deseja modificar, clicar em cima da célula cujo valor deseja atualizar, digitar o novo valor, clicar em Aplicar e depois clicar em Escrever modificações (salvar banco de dados). Pronto! E tem mais! Se você já tiver conhecimento avançado com a linguagem SQL, você também pode fazer alterações avançadas via código dentro do programa. Basta acessar a aba Executar SQL, escrever o comando SQL corretamente e depois clicar no botão de Play. Espero ter ajudado. Parabéns pelo tutorial!!! Alguém sabe me dizer se tem como salvar objetos do MTA no banco de dados, por exemplo um marker, pickup ou um player, para poder usar de comparação em um outro momento? Link to comment
Other Languages Moderators Lord Henry Posted January 15, 2021 Author Other Languages Moderators Share Posted January 15, 2021 13 hours ago, Boechat said: Alguém sabe me dizer se tem como salvar objetos do MTA no banco de dados, por exemplo um marker, pickup ou um player, para poder usar de comparação em um outro momento? O objeto não. Mas você pode salvar as informações dele como ID, posição e rotação e depois recriar o objeto com essas informações. 1 Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now