在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
我的Pessoa表有一个名为CD_PAIS的属性,该属性是对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="identificador")
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="codigo")
我尝试了许多文件和方法,但没有成功。
感谢大家的时间。
答案 0 :(得分:1)
您的代码段的问题是您错误地将reverse
属性指向另一个实体的主键。首先,reverse属性应该是另一个实体的关系属性,而不是其主键。因此,对于pessoas
实体中的Pais
属性,它应该是pais
实体中的Pessoa
属性:
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
属性,因为Pony可以找出关系属性本身。只有当实体之间有更多关系并且无法建立自动关系时,才需要指定reverse
。
如果从实体声明中删除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)
您可以在此处找到有关实体关系的更多信息:https://docs.ponyorm.com/relationships.html
您也可以使用在线实体关系图编辑器https://editor.ponyorm.com/。它可以帮助您为您的应用程序进行数据建模。
答案 1 :(得分:0)
问题在于生成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中不存在PAIS,它是一个名为CD_PAIS的字段,它是TA_PAIS中的外键。