Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Necessário criar suporte ao tipo uuid do PostgreSQL #74

Open
RodrigodosReis opened this issue Aug 23, 2024 · 1 comment
Open

Necessário criar suporte ao tipo uuid do PostgreSQL #74

RodrigodosReis opened this issue Aug 23, 2024 · 1 comment

Comments

@RodrigodosReis
Copy link

O tipo uuid do PostgreSQL não é e não pode ser comparado com um tipo string padrão.

Quando se possui uma tabela no PostgreSQL com um campo (PK ou não) do tipo uuid e se usa o método Find do ORM sobre o campo como:

FDAO.Find('campo_uuid_no_pgsql', pId);

a chamada a SimpleDAO equivalente no método Open retorna o seguinte erro:

ERRO: operador não existe: uuid = character varying.\r\nNenhum operador corresponde ao nome e tipo de dados dos argumentos fornecidos. Talvez seja necessário adicionar uma conversão de tipo de dados explícita

Isso ocorre porque o SQL gerado, na clausula WHERE tenta comparar o tipo uuid com um tipo string

@RodrigodosReis
Copy link
Author

Uma solução não definitiva para o problema foi ajustar o método Find equivalente na implementação da interface iSimpleDAO para:

function TSimpleDAO.Find(aKey: String; aValue: Variant**; aParam: String = ''**): iSimpleDAO;
var
aSQL: String;
begin
Result := Self;
if Trim(aParam) = '' then aParam := aKey;
TSimpleSQL.New(nil).Where(aKey + ' = :' + aParam).Select(aSQL);
FQuery.SQL.Clear;
FQuery.SQL.Add(aSQL);
FQuery.Params.ParamByName(aParam).Value := aValue;
FQuery.Open;
end;

Isso permite ao chamador do método informar uma key diferente do campo parametro.
No caso do PostGreSQL, a Key pode vir com um type cast, de uuid para string na chamada:

FDAO.Find('trim(cast(id_uid as varchar))', pId, 'id_uid'); // sendo id_uuid o campo uuid no banco PGSQL16

Não preparei um pull request disso por que não acho a solução definitiva nem elegante

Talvez criar um tipo de atributo para campos uuid e tratar diferente em SimpleAttributes seja o caminho certo a seguir na implementação do SimpleORM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant