For sure, it's running create_keys before the definition of fields.

I'm trying to find where is the problem...

On Feb 4, 5:11 pm, Daniel Cristian Cruz <[email protected]>
wrote:
> Hello all.
>
> I had a problem with my model, and here is it (just a bit of it):
>
> import elixir
> import sqlalchemy
> import sqlalchemy.databases
>
> class noticias_noticia(elixir.Entity):
>     id_noticia = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     titulo = elixir.Field(elixir.Unicode(200), required=True)
>     fonte = elixir.Field(elixir.Unicode(200), required=True)
>     corpo = elixir.Field(elixir.Text, required=True)
>     criacao = elixir.Field(elixir.DateTime, required=True)
>     criador = elixir.Field(sqlalchemy.databases.postgres.BIGINT)
>     a_partir = elixir.Field(elixir.DateTime)
>     ate = elixir.Field(elixir.DateTime)
>     autorizacao = elixir.Field(elixir.DateTime)
>     autorizador = elixir.Field(sqlalchemy.databases.postgres.BIGINT)
>     situacao = elixir.Field(elixir.Unicode(20), required=True)
>     noticia_id_anexos = elixir.has_many('noticia_id_anexos',
> of_kind='noticias_anexo', inverse='noticia_id_anexo')
>     noticia_id_permissaos = elixir.has_many('noticia_id_permissaos',
> of_kind='noticias_permissao', inverse='noticia_id_permissao')
>     noticia_id_noticias = elixir.has_many('noticia_id_noticias',
> of_kind='integracao_noticia', inverse='noticia_id_noticia')
>
>     elixir.using_options(tablename='noticia')
>     elixir.using_table_options(schema='noticias')
>     def __repr__(self):
>         return '<noticias.noticia "%s">' % (self.id_noticia)
>
> class noticias_arquivo(elixir.Entity):
>     id_arquivo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     caminho = elixir.Field(elixir.Unicode(400), required=True)
>     nome = elixir.Field(elixir.Unicode(200), required=True)
>     mime = elixir.Field(elixir.Unicode(200), required=True)
>     tamanho = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> required=True)
>     acesso = elixir.Field(elixir.Unicode(20), required=True)
>     md5sum = elixir.Field(elixir.Unicode(64))
>     arquivo_id_anexos = elixir.has_many('arquivo_id_anexos',
> of_kind='noticias_anexo', inverse='arquivo_id_anexo')
>     arquivo_id_imagems = elixir.has_many('arquivo_id_imagems',
> of_kind='noticias_imagem', inverse='arquivo_id_imagem')
>     arquivo_id_noticia_arquivos =
> elixir.has_many('arquivo_id_noticia_arquivos',
> of_kind='integracao_noticia_arquivo',
> inverse='arquivo_id_noticia_arquivo')
>
>     elixir.using_options(tablename='arquivo')
>     elixir.using_table_options(schema='noticias')
>     def __repr__(self):
>         return '<noticias.arquivo "%s">' % (self.id_arquivo)
>
> class noticias_anexo(elixir.Entity):
>     id_noticia = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     id_arquivo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     noticia_id_anexo = elixir.belongs_to('noticia_id_anexo',
> of_kind='noticias_noticia', field=[id_noticia],
> target_column=['id_noticia'])
>     arquivo_id_anexo = elixir.belongs_to('arquivo_id_anexo',
> of_kind='noticias_arquivo', field=[id_arquivo],
> target_column=['id_arquivo'])
>
>     elixir.using_options(tablename='anexo')
>     elixir.using_table_options(schema='noticias')
>     def __repr__(self):
>         return '<noticias.anexo "%s">' %
> (self.id_noticia,self.id_arquivo)
>
> class noticias_grupo(elixir.Entity):
>     id_grupo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     nome = elixir.Field(elixir.Unicode(200), required=True)
>     acesso_padrao = elixir.Field(elixir.Unicode(20), required=True)
>     grupo_id_permissaos = elixir.has_many('grupo_id_permissaos',
> of_kind='noticias_permissao', inverse='grupo_id_permissao')
>     grupo_id_grupo_aplicacaos =
> elixir.has_many('grupo_id_grupo_aplicacaos',
> of_kind='noticias_grupo_aplicacao',
> inverse='grupo_id_grupo_aplicacao')
>     grupo_id_noticia_grupos =
> elixir.has_many('grupo_id_noticia_grupos',
> of_kind='integracao_noticia_grupo', inverse='grupo_id_noticia_grupo')
>
>     elixir.using_options(tablename='grupo')
>     elixir.using_table_options(schema='noticias')
>     def __repr__(self):
>         return '<noticias.grupo "%s">' % (self.id_grupo)
>
> class noticias_permissao(elixir.Entity):
>     id_noticia = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     id_grupo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     noticia_id_permissao = elixir.belongs_to('noticia_id_permissao',
> of_kind='noticias_noticia', field=[id_noticia],
> target_column=['id_noticia'])
>     grupo_id_permissao = elixir.belongs_to('grupo_id_permissao',
> of_kind='noticias_grupo', field=[id_grupo],
> target_column=['id_grupo'])
>     permissao_id_permissao_da_unidades =
> elixir.has_many('permissao_id_permissao_da_unidades',
> of_kind='noticias_permissao_de_unidade',
> inverse='permissao_id_permissao_da_unidade')
>
>     elixir.using_options(tablename='permissao')
>     elixir.using_table_options(schema='noticias')
>     def __repr__(self):
>         return '<noticias.permissao "%s">' %
> (self.id_noticia,self.id_grupo)
>
> class noticias_imagem(elixir.Entity):
>     id_arquivo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     altura = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> required=True)
>     largura = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> required=True)
>     miniatura = elixir.Field(elixir.Boolean, required=True)
>     arquivo_id_imagem = elixir.belongs_to('arquivo_id_imagem',
> of_kind='noticias_arquivo', field=[id_arquivo],
> target_column=['id_arquivo'])
>
>     elixir.using_options(tablename='imagem')
>     elixir.using_table_options(schema='noticias')
>     def __repr__(self):
>         return '<noticias.imagem "%s">' % (self.id_arquivo)
>
> 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)
>
> 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_grupo(elixir.Entity):
>     id_grupo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     id_externo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     criacao = elixir.Field(elixir.DateTime, required=True)
>     alteracao = elixir.Field(elixir.DateTime)
>     grupo_id_noticia_grupo =
> elixir.belongs_to('grupo_id_noticia_grupo', of_kind='noticias_grupo',
> field=[id_grupo], target_column=['id_grupo'])
>
>     elixir.using_options(tablename='noticia_grupo')
>     elixir.using_table_options(schema='integracao')
>     def __repr__(self):
>         return '<integracao.noticia_grupo "%s">' %
> (self.id_grupo,self.id_externo)
>
> 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)
>
> class integracao_noticia_arquivo(elixir.Entity):
>     id_arquivo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> primary_key=True, required=True)
>     id_externo = elixir.Field(sqlalchemy.databases.postgres.BIGINT,
> required=True)
>     criacao = elixir.Field(elixir.DateTime, required=True)
>     alteracao = elixir.Field(elixir.DateTime)
>     arquivo_id_noticia_arquivo =
> elixir.belongs_to('arquivo_id_noticia_arquivo',
> of_kind='noticias_arquivo', field=[id_arquivo],
> target_column=['id_arquivo'])
>
>     elixir.using_options(tablename='noticia_arquivo')
>     elixir.using_table_options(schema='integracao')
>     def __repr__(self):
>         return '<integracao.noticia_arquivo "%s">' % (self.id_arquivo)
>
> 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])
> ...
> <class 'model.noticias_noticia'>
> <class 'model.noticias_arquivo'>
> <class 'model.noticias_anexo'>
> target_columns:  [Column('id_noticia', BIGINT(), table=<noticia>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_noticia, <class 'model.noticias_anexo'>)
> key_num, target_col:  0 noticia.id_noticia
> col:  id_noticia
> self, col:  Property(noticia_id_anexo, <class 'model.noticias_anexo'>)
> id_noticia
>
> target_columns:  [Column('id_arquivo', BIGINT(), table=<arquivo>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_arquivo, <class 'model.noticias_anexo'>)
> key_num, target_col:  0 arquivo.id_arquivo
> col:  id_arquivo
> self, col:  Property(arquivo_id_anexo, <class 'model.noticias_anexo'>)
> id_arquivo
>
> <class 'model.noticias_grupo'>
> <class 'model.noticias_permissao'>
> target_columns:  [Column('id_noticia', BIGINT(), table=<noticia>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_noticia, <class
> 'model.noticias_permissao'>)
> key_num, target_col:  0 noticia.id_noticia
> col:  id_noticia
> self, col:  Property(noticia_id_permissao, <class
> 'model.noticias_permissao'>) id_noticia
>
> target_columns:  [Column('id_grupo', BIGINT(), table=<grupo>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_grupo, <class 'model.noticias_permissao'>)
> key_num, target_col:  0 grupo.id_grupo
> col:  id_grupo
> self, col:  Property(grupo_id_permissao, <class
> 'model.noticias_permissao'>) id_grupo
>
> <class 'model.noticias_imagem'>
> target_columns:  [Column('id_arquivo', BIGINT(), table=<arquivo>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_arquivo, <class 'model.noticias_imagem'>)
> key_num, target_col:  0 arquivo.id_arquivo
> col:  id_arquivo
> self, col:  Property(arquivo_id_imagem, <class
> 'model.noticias_imagem'>) id_arquivo
>
> <class 'model.senai_aplicacao'>
> <class 'model.noticias_grupo_aplicacao'>
> target_columns:  [Column('id_grupo', BIGINT(), table=<grupo>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_grupo, <class
> 'model.noticias_grupo_aplicacao'>)
> key_num, target_col:  0 grupo.id_grupo
> col:  id_grupo
> self, col:  Property(grupo_id_grupo_aplicacao, <class
> 'model.noticias_grupo_aplicacao'>) id_grupo
>
> target_columns:  [Column('id_aplicacao', BIGINT(), table=<aplicacao>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_aplicacao, <class
> 'model.noticias_grupo_aplicacao'>)
> key_num, target_col:  0 aplicacao.id_aplicacao
> col:  id_aplicacao
> self, col:  Property(aplicacao_id_grupo_aplicacao, <class
> 'model.noticias_grupo_aplicacao'>) id_aplicacao
>
> <class 'model.integracao_noticia_grupo'>
> target_columns:  [Column('id_grupo', BIGINT(), table=<grupo>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_grupo, <class
> 'model.integracao_noticia_grupo'>)
> key_num, target_col:  0 grupo.id_grupo
> col:  id_grupo
> self, col:  Property(grupo_id_noticia_grupo, <class
> 'model.integracao_noticia_grupo'>) id_grupo
>
> <class 'model.integracao_noticia'>
> target_columns:  [Column('id_noticia', BIGINT(), table=<noticia>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_noticia, <class
> 'model.integracao_noticia'>)
> key_num, target_col:  0 noticia.id_noticia
> col:  id_noticia
> self, col:  Property(noticia_id_noticia, <class
> 'model.integracao_noticia'>) id_noticia
>
> target_columns:  [Column('id_aplicacao', BIGINT(), table=<aplicacao>,
> primary_key=True, nullable=False)]
> self.field[0]:  Property(id_aplicacao, <class
> 'model.integracao_noticia'>)
> key_num, target_col:  0 aplicacao.id_aplicacao
> col:  None
> self, col:  Property(aplicacao_pa_noticia, <class
> 'model.integracao_noticia'>) 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'
>
>
>
> Any help? I'm not sure what is happening with it...
>
> 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