You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
The text was updated successfully, but these errors were encountered:
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
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
The text was updated successfully, but these errors were encountered: