Inscrições abertas para nosso Webinar anual Adianti Framework 2024!
Clique aqui para saber mais
BUG no PK serial do PostgreSQL No PostgreSQL, chaves primárias marcadas como serial e no model setadas como 'serial' dá um erro SQLSTATE[42602]: Invalid name: 7 ERRO: sintaxe de nome inválida quando o registro é novo! Setando-se 'max' (mesmo a pk sendo serial) o problema se resolve. O problema está no store() do TRecord. Como corrigir o bug?...
JF
BUG no PK serial do PostgreSQL  
No PostgreSQL, chaves primárias marcadas como serial e no model setadas como 'serial' dá um erro SQLSTATE[42602]: Invalid name: 7 ERRO: sintaxe de nome inválida quando o registro é novo! Setando-se 'max' (mesmo a pk sendo serial) o problema se resolve. O problema está no store() do TRecord. Como corrigir o bug?

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (12)


PD

Acabei de testar aqui e funcionou 100%.
Recomendo libar o dump da transação. TTransaction::dump()

  1. <?php
  2. class City extends TRecord
  3. {
  4.     const TABLENAME 'city';
  5.     const PRIMARYKEY'id';
  6.     const IDPOLICY =  'serial';
  7. ?>


tutor=# \d city Table "public.city" Column | Type | Collation | Nullable | Default ----------+------------------------+-----------+----------+---------------------------------- id | integer | | not null | nextval('city_id_seq'::regclass) name | character varying(200) | | | state_id | integer | | not null |
PD

CREATE TABLE public.city (
id integer DEFAULT nextval('public.city_id_seq'::regclass) NOT NULL,
name character varying(200),
state_id integer NOT NULL
);
JF

TTransaction::dump() não resolveu e uso a seguinte sintaxe:
CREATE TABLE public.city ( id serial NOT NULL, -- sintaxe utilizada name character varying(200), state_id integer NOT NULL );

no form uso:
  1. <?php
  2. $object = new Versao;  // create an empty object
  3. $object->fromArray( (array) $data); // load the object with data
  4. $object->store(); // save the object
  5. ?>


Seria isso? pois em todos NOVOS registros dá o erro. Na edição salva direitinho!
JF

O engraçado que no arquivo de log de sql está lá o Insert (o mesmo do dump) mas o registro não está na tabela!
PD

O Log é registrado antes, por isso ele foi gravado. Caso contrário, você não conseguiria encontrar o comando.
Você está fechando a transação?
RB

Estou tendo o mesmo problema.
CR

Estou com o mesmo problema. Vocês conseguiram resolver?
CR

Estou com o mesmo problema. Vocês conseguiram resolver?
CR

Estou com o mesmo problema. Vocês conseguiram resolver?
JF

Carlos, achei 2 soluções. A primeira é não usar no PG o tipo serial. Estou usando o auto incremento, como mostro;
id integer NOT NULL DEFAULT nextval('table_name_id_seq')

A outra maneira, usando o tipo serial no PG (caso já esteja pronto) é na model da classe usar-se o IDPOLICY = 'max' assim:
  1. <?php
  2. class SystemGroupProgram extends TRecord
  3. {
  4.     const TABLENAME 'permission.system_group_program';
  5.     const PRIMARYKEY'id';
  6.     const IDPOLICY =  'max'// {max, serial}
  7.     
  8.     /**
  9.      * Constructor method
  10.      */
  11.     public function __construct($id NULL)
  12.     {
  13.         parent::__construct($id);
  14.         parent::addAttribute('system_group_id');
  15.         parent::addAttribute('system_program_id');
  16.     }
  17. }
  18. ?>

CR

Joao, muito obrigado.
JD

Olá a todos.

Esse erro acontece com que usa o Adiante Pro, como eu, e se deve a opção criar classe para entidade gerando o TABLENAME com aspas duplas no nome.

const TABLENAME = '"public"."documento"';


Ai quando ele vai gerar o nome da sequência, vem o nome com aspas: "public"."documento"_id_seq.

Solução: só remover as aspas duplas nos nomes das tabelas no model.