Como trabalhar com UUID no Scriptcase

Boa tarde, estou com um dúvida referente a formulário:

Eu quero criar um formulário que o ID dele seja um UUID.

  • O banco de dados que eu estou utilizando é Postgresql 16.
  • Deixei o campo pk do meu formulário para ser calculado pelo banco de dados no scriptcase, ou seja, o banco de dado vai gerar o UUID

Quando eu vou salvar os dados, ele não salva e me retorna um erro falando que:
sintaxe de entrada é inválida para tipo uuid: “” LINE 1: …tTest from tabela where id = ‘’ ^

Porém, já fiz o teste no banco de dados e ele está gerando o uuid normalmente. Somente quando tento criar um formulário no scriptcase que ele não gera. O controle da pk está totalmente com o banco, o scriptcase só precisa fazer o insert.

Alguém já passou por essa situação?

Única solução encontrada até o momento foi gerar o UUID direto no PHP. Para isso, existem duas vertentes, criar um algoritmo ou usar uma biblioteca.

Optei por utilizar um algoritmo. Criei uma biblioteca interna do Scriptcase para assim poder utilizar em quantas aplicações eu quiser utilizando um mesmo código, assim, facilitando a manutenção do código.

Esse código cria o UUID e verifica se ele existe em nossa tabela. Depois, o código é retornado.

Para usar ele, basta ativar a biblioteca interna que você criou, no OnBeforeInsert chamar a função gerarUUID que criamos e passar o retorno dela para a nosso campo Primary Key.

<?php
function gerarUUID($tabela, $coluna) {
	// Função para gerar UUID v4
	function generateUuidV4() {
		return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
			mt_rand(0, 0xffff), mt_rand(0, 0xffff),
			mt_rand(0, 0xffff),
			mt_rand(0, 0x0fff) | 0x4000,
			mt_rand(0, 0x3fff) | 0x8000,
			mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
		);
	}

	// Gerar um UUID único
	do {
		$novo_uuid = generateUuidV4();
		sc_lookup(ds, "SELECT COUNT(*) FROM $tabela WHERE $coluna = '$novo_uuid'");
		$count = {ds[0][0]};
	} while ($count > 0);

	// Atribuir o UUID gerado ao campo no formulário
	return $novo_uuid;
}
?>

Bom, foi assim que solucionei o problema até agora.

Acredito, entretanto, que o ideal seria deixar o próprio banco de dados criar e validar esse UUID e gerando assim sem a possibilidade de duplicidade e de maneira performática. Porém, para isso, não consegui ainda pelo Scriptcase.

Boa noite DevFullTime, eu trabalho com PostgreSQL desde sempre e se me permitir tenho algumas dicas pra compartilhar contigo:

  • evite a versão 16, mas é uma questão de experiencia, eu nunca uso a mais nova;
  • evite criar PK como uuid, mas de novo é uma questão de experiencia, eu sempre crio uma coluna ID como bigserial que será a Primary Key da tabela, na sequencia eu crio uma coluna UUID com o código “uuid_in(md5(random():: text || clock_timestamp():: text):: cstring)” como default, deixo aceitar null mas o default vai gerar um uuid automáticamente não preciso me preocupar, e pra finalizar eu crio um indice do tipo unique key com essa coluna.

Assim ao fazer um insert não precisa indicar essa coluna uuid, e se precisar gerar um uuid antes do insert para mandar no statement, use o comando “select uuid_in(md5(random():: text || clock_timestamp():: text):: cstring) as uuid” e use o resultado;

Se fizer um statement bonito no PHP antes do insert, é possivel inclusive conseguir o uuid e mandar no insert sempre.

Obs. O maldito scriptcase só tem um problema que aborrece com o UUID: ele não interpresa colunas de UUID com 36 caracteres, temos sempre que corrigir os tamanhos que ele supostamente pegou do banco de 16 para 36. Deve ter alguma lógica nisso, mas aborrece pois se esquecer tá ferrado.

1 Curtida

ahh sim, esqueci de um detalhe aí no seu post:

  • eu recomendo que para colunas do tipo uuid, se não for para você mandar o UUID gerado antes, configure o SC para: “calculado pelo banco de dados SE VAZIO assim ele vai preencher com NULL em caso de vazio, que é diferente de “” (vazio) porque uuid não aceita vazio.
1 Curtida

O 16 ainda não está homologado para o Scriptcase.
No changelog somente mostra a versão 15.
No manual também somente mostra a versão 15: PostgreSQL no Scriptcase - Documentação Scriptcase

UUID como PK não sei se fica muito otimizado nos selects ou index. Pois não é uma sequência.

Não sabia deste detalhe dos 36 caracteres.
Valeu por compartilhar.

1 Curtida

Obrigado pelas informações de grande valia. Como no meu caso, estou fazendo uma aplicação que necessita que os ID sejam em UUID, pois tenho que evitar o “acerto” de Primary Key, não tive como fugir. Mas seguirem suas dicas! :facepunch:

Olá, Alexandre, não sabia sobre essa informação. Obrigado por compartilhar. Acredito que serei a cobaia do postgreSQL 16. Está funcionando até o momento tudo normalmente, o único problema que tive foi com o UUID. :facepunch:

1 Curtida