Django + PostgreSQL: Como usar SCHEMA?

482 views
Skip to first unread message

Juliano Atanazio

unread,
Apr 3, 2016, 8:37:24 AM4/3/16
to Python Brasil
Bom dia.

Sou DBA PostgreSQL e estou começando a aprender o Django.
Preciso de uma pequena ajuda (acho...)

Em minha base de dados criei um schema e o chamei de "sc_boletim".
Para fins de aprendizado estou tentando criar uma tabela nesse schema, saindo do padrão que é o "public".

Eis meu models.py:

=======================================================================

from django.db.models import Model
from django.db.models import CharField
from django.db.models import DateTimeField
from django.db.models import EmailField
from django.db.models import IntegerField




# Create your models here.
class Registro(Model):
    nome = CharField(max_length=120, blank=False, null=False)
    email = EmailField()
    cep = IntegerField()
    data_registro = DateTimeField(auto_now_add=True, auto_now=False)
    ultima_atualizacao = DateTimeField(auto_now_add=False, auto_now=True)

    def __str__(self):
        return self.email

    class Meta:
#        db_schema = 'sc_boletim'
        db_table = '"sc_boletim"."tb_registro"'




=======================================================================

Ou se preferir o link em pastebin.com [1]


Como faço para usar schemas no Django?

Obrigado.














Fabio C. Barrionuevo da Luz

unread,
Apr 3, 2016, 9:41:48 AM4/3/16
to python...@googlegroups.com
Ola Juliano, o Django até o momento NÃO suporta oficialmente múltiplos schemas de banco de dados para nenhum do backends[1] de banco de dados oficialmente suportados.

Esse é um problema bem antigo e complicado de resolver, porque precisa de várias modificações profundas e complexas no ORM e no sistema de migrações, e modificações como essa costumam não ser retrocompativeis, e quebrar a retrocompatibilidade sem o devido processo de depreciação[1] não é uma opção para Django.

Um outro problema é que a implementação de SCHEMAS no Postgresql (um usuário pode ter multiplos schemas e um schema pode ser acessível por múltiplos usuários ) é diferente da que é implementada no Oracle (um usuário pode ter um único schema e um schema pode ser acessível por múltiplos usuários)

e inexiste em MySQL (embora o mysql use schema na documentação, ele é totalmente diferente de Postgresql e Oracle e não faz a mesma coisa, nem de maneira similar)

Esses são alguns dos tickets relacionados


Recentemente, em Django 1.8, foi finalmente refatorada a api interna privada que gerenciava a classe interna Meta do django, e essa API foi tornada publica, essa fato, diminuiu a complexidade de adicionar suporte a múltiplos schemas no Dango.

O Anssi Kääriäinen (akaariai), um dos core developers do django estava trabalhando pouco tempo livre que ele tem, para adicionar suporte a múltiplos schemas inicialmente para Postgresql:












--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Fábio C. Barrionuevo da Luz
Palmas - Tocantins - Brasil - América do Sul


Blog colaborativo sobre Python e tecnologias Relacionadas, mantido totalmente no https://github.com/pythonclub/pythonclub.github.io .

Todos são livres para publicar. É só fazer fork, escrever sua postagem e mandar o pull-request. Leia mais sobre como publicar em README.md e contributing.md.
Regra básica de postagem:
"Você" acha interessante? É útil para "você"? Pode ser utilizado com Python ou é útil para quem usa Python? Está esperando o que? Publica logo, que estou louco para ler...

Juliano Atanazio

unread,
Apr 3, 2016, 11:44:01 AM4/3/16
to Python Brasil


On Sunday, April 3, 2016 at 10:41:48 AM UTC-3, Fabio Caritas Barrionuevo da Luz wrote:
Ola Juliano, o Django até o momento NÃO suporta oficialmente múltiplos schemas de banco de dados para nenhum do backends[1] de banco de dados oficialmente suportados.

Esse é um problema bem antigo e complicado de resolver, porque precisa de várias modificações profundas e complexas no ORM e no sistema de migrações, e modificações como essa costumam não ser retrocompativeis, e quebrar a retrocompatibilidade sem o devido processo de depreciação[1] não é uma opção para Django.

Um outro problema é que a implementação de SCHEMAS no Postgresql (um usuário pode ter multiplos schemas e um schema pode ser acessível por múltiplos usuários ) é diferente da que é implementada no Oracle (um usuário pode ter um único schema e um schema pode ser acessível por múltiplos usuários)

e inexiste em MySQL (embora o mysql use schema na documentação, ele é totalmente diferente de Postgresql e Oracle e não faz a mesma coisa, nem de maneira similar)

Esses são alguns dos tickets relacionados


Recentemente, em Django 1.8, foi finalmente refatorada a api interna privada que gerenciava a classe interna Meta do django, e essa API foi tornada publica, essa fato, diminuiu a complexidade de adicionar suporte a múltiplos schemas no Dango.

O Anssi Kääriäinen (akaariai), um dos core developers do django estava trabalhando pouco tempo livre que ele tem, para adicionar suporte a múltiplos schemas inicialmente para Postgresql:








Obrigado pela atenção, amigo.
Encontrei uma aqui algo que parece que deu certo:

class Meta:
        db_table = 'sc_boletim"."tb_registro'


O ponto entre as aspas (".") separando o schema da tabela fez a diferença.

Ainda vou testar com mais calma.
Aparentemente deu certo nos testes que fiz aqui.

Mais uma vez obrigado.

Grande abraço!

Juliano Atanazio

unread,
Apr 3, 2016, 12:01:04 PM4/3/16
to Python Brasil


On Sunday, April 3, 2016 at 12:44:01 PM UTC-3, Juliano Atanazio wrote:


On Sunday, April 3, 2016 at 10:41:48 AM UTC-3, Fabio Caritas Barrionuevo da Luz wrote:
Ola Juliano, o Django até o momento NÃO suporta oficialmente múltiplos schemas de banco de dados para nenhum do backends[1] de banco de dados oficialmente suportados.

Esse é um problema bem antigo e complicado de resolver, porque precisa de várias modificações profundas e complexas no ORM e no sistema de migrações, e modificações como essa costumam não ser retrocompativeis, e quebrar a retrocompatibilidade sem o devido processo de depreciação[1] não é uma opção para Django.

Um outro problema é que a implementação de SCHEMAS no Postgresql (um usuário pode ter multiplos schemas e um schema pode ser acessível por múltiplos usuários ) é diferente da que é implementada no Oracle (um usuário pode ter um único schema e um schema pode ser acessível por múltiplos usuários)

e inexiste em MySQL (embora o mysql use schema na documentação, ele é totalmente diferente de Postgresql e Oracle e não faz a mesma coisa, nem de maneira similar)

Esses são alguns dos tickets relacionados


Recentemente, em Django 1.8, foi finalmente refatorada a api interna privada que gerenciava a classe interna Meta do django, e essa API foi tornada publica, essa fato, diminuiu a complexidade de adicionar suporte a múltiplos schemas no Dango.

O Anssi Kääriäinen (akaariai), um dos core developers do django estava trabalhando pouco tempo livre que ele tem, para adicionar suporte a múltiplos schemas inicialmente para Postgresql:








Obrigado pela atenção, amigo.
Encontrei uma aqui algo que parece que deu certo:

class Meta:
        db_table = 'sc_boletim"."tb_registro'


Obs.: O schema tem que existir previamente no banco. CREATE SCHEMA sc_boletim;

Carlos Perche

unread,
Apr 4, 2016, 7:19:52 AM4/4/16
to Python Brasil
Juliano, da uma olhada no source dessa app django-tenant-schemas 

vai encontrar o que precisa

Fabio C. Barrionuevo da Luz

unread,
Apr 4, 2016, 7:23:33 AM4/4/16
to python...@googlegroups.com

2016-04-04 8:19 GMT-03:00 Carlos Perche <carlosfel...@gmail.com>:
Juliano, da uma olhada no source dessa app django-tenant-schemas 

vai encontrar o que precisa

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages