2011/2/7 Gaetan de Menten <[email protected]>

> > And here is the test (I put some prints in create_keys):
> >
> >>>> from model import *
> >>>> elixir.metadata.bind = "postgresql+psycopg2://sgn2:sgn2@copernico
> /senai"
> >>>> for item in elixir.entities:
> > ...  print item
> > ...  elixir.setup_entities([item])
>
> This pattern is not supported. setup_entities only works for
> "fully-contained groups of entities". You can't setup one entity at a
> time, unless it has no link to any other entity. In other words, you
> have to setup all entities which have links to each other in the same
> call to setup_entities.
>
> Some cases of entity per entity setup might work if you happen to use
> the correct order but you shouldn't rely on that. The usual use case
> is setup_all(). And the less usual case is when you have several
> independant groups of entities, you can set them up independently by
> using setup_entities(the_whole_group). But entity per entity is not a
> supported use case.
>
>
Yes, I knew it. It runs in the same order the SQL from Toad Data Modeler (I
wrote a XSLT to build a model.py for elixir). They are in the correct order,
because I see the setup ok (my comments in red):

1: <class 'model.noticias_noticia'>
2: <class 'model.noticias_arquivo'>
3: <class 'model.noticias_anexo'>
4: self.field[key_num].column:  id_noticia (defined in line 1) (print in
elixir/relationships.py, line 688)
5: self.field[key_num].column:  id_arquivo (defined in line 2)
6: <class 'model.noticias_grupo'>
7: <class 'model.noticias_permissao'>
8: self.field[key_num].column:  id_noticia (defined in line 1)
9: self.field[key_num].column:  id_grupo (defined in line 6)
10: <class 'model.noticias_imagem'>
11: self.field[key_num].column:  id_arquivo (defined in line 2)
12: <class 'model.senai_aplicacao'>
13: <class 'model.noticias_grupo_aplicacao'>
14: self.field[key_num].column:  id_grupo (defined in line 6)
15: self.field[key_num].column:  id_aplicacao (defined in line 12)
16: <class 'model.integracao_noticia_grupo'>
17: self.field[key_num].column:  id_grupo (defined in line 6)
18: <class 'model.integracao_noticia'>
19: self.field[key_num].column:  id_noticia (defined in line 1)
20: self.field[key_num].column:  None (was defined in line 12, but it
returns None)
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "elixir/entity.py", line 951, in setup_entities
    method()
  File "elixir/entity.py", line 240, in setup_relkeys
    self.call_builders('create_non_pk_cols')
  File "elixir/entity.py", line 481, in call_builders
    getattr(builder, what)()
  File "elixir/relationships.py", line 451, in create_non_pk_cols
    self.create_keys(False)
  File "elixir/relationships.py", line 725, in create_keys
    fk_colnames.append(col.key)
AttributeError: 'NoneType' object has no attribute 'key'

The definition of 12 is:

class senai_aplicacao(elixir.Entity):
    id_aplicacao = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
primary_key=True, required=True)
    nome = elixir.Field(elixir.Unicode(200), required=True)
    sigla = elixir.Field(elixir.Unicode(20), required=True)
    id_registro = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
required=True)
    tabela = elixir.Field(elixir.Text, required=True)
    criacao = elixir.Field(elixir.DateTime, required=True)
    alteracao = elixir.Field(elixir.DateTime)
    id_criador = elixir.Field(sqlalchemy.databases.postgres.BIGINT)
    id_aplicacao_criador =
elixir.Field(sqlalchemy.databases.postgres.BIGINT)
    id_alterador = elixir.Field(sqlalchemy.databases.postgres.BIGINT)
    id_aplicacao_alterador =
elixir.Field(sqlalchemy.databases.postgres.BIGINT)
    aplicacao_id_grupo_aplicacaos =
elixir.has_many('aplicacao_id_grupo_aplicacaos',
of_kind='noticias_grupo_aplicacao', inverse='aplicacao_id_grupo_aplicacao')
    aplicacao_pa_noticias = elixir.has_many('aplicacao_pa_noticias',
of_kind='integracao_noticia', inverse='aplicacao_pa_noticia')
    aplicacao_pa_unidades = elixir.has_many('aplicacao_pa_unidades',
of_kind='integracao_unidade', inverse='aplicacao_pa_unidade')
    aplicacao_id_video_aplicacaos =
elixir.has_many('aplicacao_id_video_aplicacaos',
of_kind='tvsenai_video_aplicacao', inverse='aplicacao_id_video_aplicacao')
    aplicacao_pa_categorias = elixir.has_many('aplicacao_pa_categorias',
of_kind='tvsenai_categoria', inverse='aplicacao_pa_categoria')
    aplicacao_id_administradors =
elixir.has_many('aplicacao_id_administradors',
of_kind='tvsenai_administrador', inverse='aplicacao_id_administrador')
    aplicacao_pa_registro_criadors =
elixir.has_many('aplicacao_pa_registro_criadors', of_kind='senai_registro',
inverse='aplicacao_pa_registro_criador')
    aplicacao_pa_registro_alteradors =
elixir.has_many('aplicacao_pa_registro_alteradors',
of_kind='senai_registro', inverse='aplicacao_pa_registro_alterador')
    aplicacao_id_pessoas = elixir.has_many('aplicacao_id_pessoas',
of_kind='integracao_pessoa', inverse='aplicacao_id_pessoa')
    aplicacao_id_colaboradors = elixir.has_many('aplicacao_id_colaboradors',
of_kind='integracao_colaborador', inverse='aplicacao_id_colaborador')
    aplicacao_id_fornecedors = elixir.has_many('aplicacao_id_fornecedors',
of_kind='integracao_fornecedor', inverse='aplicacao_id_fornecedor')
    aplicacao_id_galeria_aplicacaos =
elixir.has_many('aplicacao_id_galeria_aplicacaos',
of_kind='galerias_galeria_aplicacao',
inverse='aplicacao_id_galeria_aplicacao')
    aplicacao_pa_registro_removidos =
elixir.has_many('aplicacao_pa_registro_removidos',
of_kind='senai_registro_removido', inverse='aplicacao_pa_registro_removido')
    aplicacao_pa_categorias = elixir.has_many('aplicacao_pa_categorias',
of_kind='videos_categoria', inverse='aplicacao_pa_categoria')
    aplicacao_id_aplicacao_administradas =
elixir.has_many('aplicacao_id_aplicacao_administradas',
of_kind='videos_aplicacao_administrada',
inverse='aplicacao_id_aplicacao_administrada')
    aplicacao_pa_menus = elixir.has_many('aplicacao_pa_menus',
of_kind='senai_menu', inverse='aplicacao_pa_menu')
    aplicacao_id_projeto_financeiros =
elixir.has_many('aplicacao_id_projeto_financeiros',
of_kind='integracao_projeto_financeiro',
inverse='aplicacao_id_projeto_financeiro')
    aplicacao_pa_rascunhos = elixir.has_many('aplicacao_pa_rascunhos',
of_kind='senai_rascunho', inverse='aplicacao_pa_rascunho')
    aplicacao_pa_modulos = elixir.has_many('aplicacao_pa_modulos',
of_kind='senai_modulo', inverse='aplicacao_pa_modulo')

    elixir.using_options(tablename='aplicacao')
    elixir.using_table_options(schema='senai')
    def __repr__(self):
        return '<senai.aplicacao "%s">' % (self.id_aplicacao)

And the definition of 13 and 18 are:

class noticias_grupo_aplicacao(elixir.Entity):
    id_grupo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
primary_key=True, required=True)
    id_aplicacao = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
primary_key=True, required=True)
    grupo_id_grupo_aplicacao = elixir.belongs_to('grupo_id_grupo_aplicacao',
of_kind='noticias_grupo', field=[id_grupo], target_column=['id_grupo'])
    aplicacao_id_grupo_aplicacao =
elixir.belongs_to('aplicacao_id_grupo_aplicacao', of_kind='senai_aplicacao',
field=[id_aplicacao], target_column=['id_aplicacao'])

    elixir.using_options(tablename='grupo_aplicacao')
    elixir.using_table_options(schema='noticias')
    def __repr__(self):
        return '<noticias.grupo_aplicacao "%s">' %
(self.id_grupo,self.id_aplicacao)

class integracao_noticia(elixir.Entity):
    id_noticia = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
primary_key=True, required=True)
    id_aplicacao = elixir.Field(sqlalchemy.databases.postgres.BIGINT)
    id_externo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
required=True)
    criacao = elixir.Field(elixir.DateTime, required=True)
    alteracao = elixir.Field(elixir.DateTime)
    noticia_id_noticia = elixir.belongs_to('noticia_id_noticia',
of_kind='noticias_noticia', field=[id_noticia],
target_column=['id_noticia'])
    aplicacao_pa_noticia = elixir.belongs_to('aplicacao_pa_noticia',
of_kind='senai_aplicacao', field=[id_aplicacao],
target_column=['id_aplicacao'])

    elixir.using_options(tablename='noticia')
    elixir.using_table_options(schema='integracao')
    def __repr__(self):
        return '<integracao.noticia "%s">' % (self.id_noticia)

The question is: why it works in the first one, and not in the last one?

I'm trying to find out, but I'm loose, I guess.

Regards,
-- 
Daniel Cristian Cruz
クルズ クリスチアン ダニエル

-- 
You received this message because you are subscribed to the Google Groups 
"SQLElixir" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlelixir?hl=en.

Reply via email to