Pergunta

Eu estou encontrando-me com um projeto django manipulação de duas classes distintas mapeada sobre um nome de tabela:

class BarA(models.Model):
[...]
class Meta:
    db_table = 'bar' # doesn't specify any schema

class BarB(models.Model):
[...]
class Meta:
    db_table = u'foo"."bar'

O projeto está usando um banco de dados contendo dois esquemas: public e foo.

A forma como esta aplicação é modelado e implementado torna as coisas ainda mais confusas:em alguns servidores, o django se conecta ao banco de dados com o usuário "John", não é membro de qualquer função, mas em outros servidores que se conecta com o usuário "Eric", membro de um foo papel.

Duas questões aqui:

  1. Se django meta de classe não menciona nenhum esquema específico, como Postgres decidir qual a tabela a que ele vai trabalhar com ?Até agora, parece que o usuário Eric vai sempre acertar o foo.bar tabela, e nunca o public.bar um, independentemente do chamado de classe.Com o usuário "John", eu só estou usando BarA classe e corretamente hits public.bar.
  2. Django não parece lidar com esquemas;é esta solução considerado como uma boa prática para esse tipo de caso (por favor note que eu não pode renomear as tabelas existentes)?
Foi útil?

Solução

No postgres search_path variável definir a prioridade para a escolha do esquema para a tabela:

search_path (seqüência de caracteres)
Esta variável especifica a ordem em que os esquemas são procuradas quando um objeto (tabela, tipo de dados, função, etc.) é referenciado por um nome simples com nenhum esquema especificado.Quando há são objetos de nomes idênticos em diferentes esquemas, o que foi encontrado primeiro no caminho de pesquisa é usado.
[...]
O atual valor efetivo do caminho de procura pode ser examinado através da função SQL current_schemas.

Uma maneira rápida de fazer isso:

SELECT current_schemas(True);

Você pode encontrar detalhes sobre como gerenciar search_path na seção 5.7.3.para este artigo: http://www.postgresql.org/docs/current/static/ddl-schemas.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top