sql >> Databáze >  >> RDS >> PostgreSQL

Výjimka v JPA při použití seed souboru pro PostgreSQL

Problém nebyl v syntaxi, protože syntaxe perfektně fungovala s flyway nebo přímo v PostgreSQL CLI. Problém byl s Hibernate, konkrétně s parsováním importovaného souboru. Hibernate funguje tak, že spouští každý výraz ze souborů jednotlivě, nikoli celý obsah jako jeden výraz. Snažil jsem se dát všechny definice funkcí na jeden řádek a fungovalo to, ale nebylo to čitelné. Zjistil jsem tedy, že existuje konfigurace pro Hibernate, která říká, že výrazy mohou být víceřádkové, ale $$ oddělovač byl při použití ve více řádcích stále nerozpoznaný.

Řešením tedy bylo definovat příkaz pomocí ' oddělovač a poté v případě potřeby uvozovky ukončete dalším ' .

Řešením je nastavit spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor použít org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor . MultipleLinesSqlCommandExtractor extrahuje výraz SQL z více řádků a zastaví se, když je přítomen středník. To je konec výrazu. Zabalením těla funkce do řetězce s jednou uvozovkou bude Hibernate považovat toto zalamování za jeden řádek.

data.sql

CREATE OR REPLACE FUNCTION insert_timeout_configuration() RETURNS bigint AS '
  DECLARE created_id bigint;

  BEGIN
    INSERT INTO timeout_configuration (id, version, timeout)
    VALUES (nextval(''my_sequence''), 0, 300)
    RETURNING id INTO created_id;
    return created_id;
  END;
' language plpgsql;

CREATE OR REPLACE FUNCTION insert_url_configuration() RETURNS bigint AS '
  DECLARE created_id bigint;

  BEGIN
    INSERT INTO url_configuration (id, version, my_url)
    VALUES (nextval(''my_sequence''), 0,''http://localhost:8080/'')
    RETURNING id INTO created_id;
    return created_id;
  END;
' language plpgsql;

DO '
      INSERT INTO global_configuration(id, version, name, timeout_configuration_id, url_configuration_id)
      VALUES (nextval(''my_sequence''), 0, ''My global config'', insert_timeout_configuration(), insert_url_configuration());

-- do some other code 
END
';
drop function insert_timeout_configuration();
drop function insert_url_configuration();

Vždy musím mít na paměti, abych unikal jednoduchým uvozovkám ve výrazech, ale nyní mohu mít pro člověka čitelnější počáteční soubor.




  1. Přidání jednoho ze dvou nenulových omezení v postgresql

  2. Jak QUOTE() funguje v MariaDB

  3. Jak změnit formát data v databázi Oracle

  4. Nekompatibilita MySQL PHP