1

我有 2 张桌子。A和表B

TableA

+------+----------------+-----------+
|  id  | some_attribute | tableB_id |
+------+----------------+-----------+

id=主键

some_attribute=varchar

TableB_id=外键

TableB

+------+----------------+
|  id  | some_attribute |
+------+----------------+

id=主键

some_attribute=varchar


我的代码:

# establish a connection with the database (MySQL)
db = Connection.Connection.connect_db_server_default()


class TableB(db.Entity):
    _table_ = "table_b"
    id = PrimaryKey(int, auto=False)
    some_attribute = Required(str)


class TableA(db.Entity):
    _table_ = "table_a"
    id = PrimaryKey(int, auto=False)
    some_attribute = Required(str)
    TableB_id = Set(TableA)

给出以下错误:
pony.orm.core.ERDiagramError: Reverse attribute for TableA.TableB_id not found


我的问题:

如何使用 Pony ORM 重新创建上述关系?实体总是需要有双向关系吗?

有什么方法可以实现正确的数据库规范化,还是我必须使用一些不同的 ORM 模块?

4

1 回答 1

2

看起来这里的错误是我自己的,对此的答案在 Pony-ORM 文档中指定。

我假设由于TableB是独立的并且是被引用的表,它不应该有任何从自身到TableA的映射。然而,文档指定:

一些映射器(例如 Django)只需要在一侧定义关系。Pony 需要显式定义双方的关系(正如 Python 之禅所读:显式优于隐式),这允许用户从每个实体的角度查看所有关系。

从文档同一部分发布的示例中:

# If we want to allow an instance of OrderItem to exist without
# being assigned to an 'Order', we can define the order attribute as Optional:
class Order(db.Entity):
    items = Set(lambda: Order)

class OrderItem(db.Entity):
    order = Optional(Order)

尽管Pony-ORM的工作方式在数据库规范化方面是完全错误的,但它不能以任何其他方式运行。一个模块不应该被盲目地使用,而不是先花一些时间来正确阅读文档。

道德课

NE版本假设。阅读您的文档

于 2019-02-07T22:54:08.920 回答