AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 76494
Accepted
Gili
Gili
Asked: 2014-09-14 23:09:02 +0800 CST2014-09-14 23:09:02 +0800 CST 2014-09-14 23:09:02 +0800 CST

Esquema temporário por conexão?

  • 772

Estou tentando migrar meus testes de unidade de H2 para Postgresql.

Atualmente, o H2 me fornece um esquema na memória de modo que cada conexão seja mapeada para um esquema exclusivo, crie as tabelas, execute o teste e descarte o esquema. A criação e destruição do esquema são tratadas automaticamente pelo H2.

Os testes de unidade são executados simultaneamente.

Qual é a melhor maneira de fazer isso no Postgresql? Especificamente,

  1. Como obtenho um esquema exclusivo por conexão?
    • A estrutura de teste deve gerar nomes exclusivos ou há um mecanismo integrado para fazer isso?
  2. Como posso garantir que o esquema seja descartado quando a conexão for interrompida?
    • Não quero acabar com esquemas pendentes quando os testes de unidade forem eliminados.
  3. Qual abordagem produzirá o melhor desempenho?
    • Preciso criar/eliminar dezenas de esquemas por segundo.

ATUALIZAÇÃO : Encontrei uma resposta relacionada aqui , mas ela falha ao descartar esquemas caso o processo que executa os testes de unidade seja interrompido.

postgresql unit-test
  • 4 4 respostas
  • 17199 Views

4 respostas

  • Voted
  1. Best Answer
    hbn
    2014-09-17T00:13:15+08:002014-09-17T00:13:15+08:00

    pg_tempé um alias para o esquema temporário da sessão atual.

    Se você fizer um SET search_path TO pg_tempantes de executar seus testes, tudo deve funcionar (desde que nada esteja referenciando explicitamente um esquema).

    Se você não deseja alterar seu script, defina search_patho usuário com o qual os testes efetuam login como:

    > ALTER ROLE testuser SET search_path = pg_temp;
    

    Então, tudo o que o usuário criar estará em pg_temp, a menos que seja explicitamente especificado.

    Aqui está um exemplo de psql, mostrando o esquema real (para esta conexão) para o qual o alias é resolvido:

    > SET search_path TO pg_temp;
    SET
    > create table test();
    CREATE TABLE
    > \dt test
              List of relations
      Schema   | Name | Type  |  Owner
    -----------+------+-------+----------
     pg_temp_4 | test | table | postgres
    (1 row)
    

    E, como seria de esperar, esse esquema é diferente para cada conexão simultânea e desaparece depois que a conexão é encerrada.

    Observe que isso também funciona para funções, embora você tenha que referenciar explicitamente o esquema pg_temp ao chamá-las.

    • 15
  2. Erwin Brandstetter
    2014-09-15T11:29:49+08:002014-09-15T11:29:49+08:00

    Você pode obter o nome do esquema temporário atual (depois de criar a primeira tabela temporária), conforme apresentado no link que você adicionou:

    SELECT nspname
    FROM   pg_namespace
    WHERE  oid = pg_my_temp_schema();
    

    Mas seu plano atual ainda não faria muito sentido. Para criar tabelas no esquema temporário atual, basta criar tabelas temporárias. Isso é tudo. Por padrão, o search_pathé definido para que as tabelas temporárias sejam visíveis primeiro. Nunca é necessário qualificar o esquema de tabelas temporárias. Você nunca deveria ter que abordar o esquema temporário atual diretamente de forma alguma - isso é um detalhe de implementação.

    • 3
  3. hbn
    2014-09-15T11:22:57+08:002014-09-15T11:22:57+08:00

    Seus testes envolvem transações? DDL é transacional no PostgreSQL, portanto, se você criar seu esquema e tabelas e executar seus testes, tudo em uma única transação que é revertida, o esquema nunca é realmente confirmado e visível para outras sessões.

    Você ainda precisaria usar um nome provavelmente exclusivo para seu esquema (talvez inclua nome de host e PID), pois CREATE SCHEMAfalhará imediatamente se já existir um esquema com nome idêntico e será bloqueado se outra sessão tiver criado um esquema com nome idêntico em uma transação não confirmada.

    Uma alternativa seria apenas usar tabelas temporárias, se você puder modificar seus scripts de criação de banco de dados para fazer isso.

    • 1
  4. Gili
    2014-09-15T00:02:31+08:002014-09-15T00:02:31+08:00

    Acabei de ter uma ideia.

    O Postgresql garante que uma sessão não possa ver as tabelas temporárias de outra. Acho que isso significa que, quando você cria uma tabela temporária, ela cria um esquema temporário. Então talvez eu possa fazer o seguinte:

    1. Crie uma tabela temporária (fictícia) e procure seu esquema.
    2. Use este esquema para o teste (crie as tabelas, execute o teste).
    3. Quando a conexão for fechada, o Postgresql descartará o esquema.

    Não gosto de confiar em detalhes de implementação, mas neste caso parece bastante seguro.

    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve