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.
