Python pony.orm.core.ERDiagramError:反向属性不一致

Python pony.orm.core.ERDiagramError:反向属性不一致,python,orm,pony,ponyorm,Python,Orm,Pony,Ponyorm,在Pony ORM上指定表时出现此错误 File "business.py", line 79, in <module> db.generate_mapping() File "<string>", line 2, in generate_mapping File "/home/ancinedev/.pyenv/versions/3.6.1/lib/python3.6/site-packages/pony/utils/utils.py", line 5

在Pony ORM上指定表时出现此错误

  File "business.py", line 79, in <module>
    db.generate_mapping()
  File "<string>", line 2, in generate_mapping
  File "/home/ancinedev/.pyenv/versions/3.6.1/lib/python3.6/site-packages/pony/utils/utils.py", line 58, in cut_traceback
    return func(*args, **kwargs)
  File "/home/ancinedev/.pyenv/versions/3.6.1/lib/python3.6/site-packages/pony/orm/core.py", line 724, in generate_mapping
    entity._link_reverse_attrs_()
  File "/home/ancinedev/.pyenv/versions/3.6.1/lib/python3.6/site-packages/pony/orm/core.py", line 3511, in _link_reverse_attrs_
    throw(ERDiagramError, 'Inconsistent reverse attributes %s and %s' % (attr, attr2))
  File "/home/ancinedev/.pyenv/versions/3.6.1/lib/python3.6/site-packages/pony/utils/utils.py", line 96, in throw
    raise exc
pony.orm.core.ERDiagramError: Inconsistent reverse attributes Pais.pessoas and Pessoa.identificador
我尝试了很多纪录片和方法,但都没有成功


感谢大家抽出时间。

代码片段的问题在于,您错误地将
reverse
属性指向另一个实体的主键。首先,reverse属性应该是另一个实体的relationship属性,而不是它的主键。因此,对于
Pais
实体中的
pessoas
属性,它应该是
Pessoa
实体中的
Pais
属性:

class Pais(db.Entity):
    _table_ = ['SAD', 'TA_PAIS']
    codigo = PrimaryKey(int, column="CD_PAIS")
    nome = Required(str, column="NM_PAIS")
    pessoas = Set(lambda: Pessoa, reverse="pais")

class Pessoa(db.Entity):
    _table_ = ['SAD', 'TB_PESSOA']
    identificador = PrimaryKey(int, column="ID_PESSOA")
    nome = Required(str, column="NM_PESSOA")
    tipo_pessoa = Required(str, column="IN_TIPO_PESSOA")
    numero_registro = Optional(str, column="NR_REGISTRO")
    pais = Required(Pais, reverse="pessoas")
但在本例中,不需要指定
reverse
属性,因为小马可以自己判断关系属性。仅当实体之间存在多个关系且无法自动建立关系时,才需要指定反向

如果从实体声明中删除
反向
,它将正常工作:

class Pais(db.Entity):
    _table_ = ['SAD', 'TA_PAIS']
    codigo = PrimaryKey(int, column="CD_PAIS")
    nome = Required(str, column="NM_PAIS")
    pessoas = Set(lambda: Pessoa)

class Pessoa(db.Entity):
    _table_ = ['SAD', 'TB_PESSOA']
    identificador = PrimaryKey(int, column="ID_PESSOA")
    nome = Required(str, column="NM_PESSOA")
    tipo_pessoa = Required(str, column="IN_TIPO_PESSOA")
    numero_registro = Optional(str, column="NR_REGISTRO")
    pais = Required(Pais)
在这里,您可以找到有关实体关系的更多信息:


此外,您可能还需要使用联机实体关系图编辑器。它可以帮助您为应用程序进行数据建模。

问题在于何时生成SQL

File "/home/dev/.pyenv/versions/3.6.1/lib/python3.6/site-packages/pony/orm/dbapiprovider.py", line 55, in wrap_dbapi_exceptions
    except dbapi_module.DatabaseError as e: raise DatabaseError(e)
pony.orm.dbapiprovider.DatabaseError: ORA-00904: "TB_PESSOA"."PAIS": invalid identifier

SELECT "TB_PESSOA"."ID_PESSOA", "TB_PESSOA"."NM_PESSOA", "TB_PESSOA"."IN_TIPO_PESSOA", "TB_PESSOA"."NR_REGISTRO", "TB_PESSOA"."PAIS"
FROM "SAD"."TB_PESSOA" "TB_PESSOA"
WHERE 0 = 1
在TB_PESSOA中不存在PAI事实上,它是一个名为CD_PAIS的字段,是TA_Pai的外键

File "/home/dev/.pyenv/versions/3.6.1/lib/python3.6/site-packages/pony/orm/dbapiprovider.py", line 55, in wrap_dbapi_exceptions
    except dbapi_module.DatabaseError as e: raise DatabaseError(e)
pony.orm.dbapiprovider.DatabaseError: ORA-00904: "TB_PESSOA"."PAIS": invalid identifier

SELECT "TB_PESSOA"."ID_PESSOA", "TB_PESSOA"."NM_PESSOA", "TB_PESSOA"."IN_TIPO_PESSOA", "TB_PESSOA"."NR_REGISTRO", "TB_PESSOA"."PAIS"
FROM "SAD"."TB_PESSOA" "TB_PESSOA"
WHERE 0 = 1