2

我最初启动了一个小型 python 项目(Python、Tkinter 和 PonyORM)并且变得更大,这就是为什么我决定将代码(过去只是单个文件)划分为几个模块(例如 main、form1、entity、database)。Main 作为主控制器,以 form1 为例可以包含一个 tkinter Frame,它可以用作用户可以输入数据的接口,entity 包含 pony.Database 实例的 db.Enttiy 映射和数据库及其连接详细信息. 我认为问题是在导入期间,我收到此错误“pony.orm.core.ERDiagramError:无法定义实体'EmpInfo':已经生成数据库映射”。您能否指出我应该如何完成的任何现有代码。

4

2 回答 2

0

可能您以错误的顺序导入模块。任何包含实体定义的模块都应该在db.generate_mapping()调用之前导入。

我认为您应该在所有导入都已完成时db.generate_mapping()在进入之前立即致电。tk.mainloop()

于 2018-09-14T10:30:12.400 回答
0

避免这种情况的一个好方法不是让您的db.generate_mapping()调用发生在模块的顶级代码中,而是拥有一个模块导出的函数,该函数db.generate_mapping()在导入所有其他模块后调用。

我使用的模式是将所有db.Entity子类放入一个名为 的模块model中,然后在底部model.py是:

def setup():
    """ Set up the database """
    db.bind(**database_config, create_db=True)
    db.generate_mapping(create_tables=True)

这个函数由我的应用程序自己的启动调用(它也负责设置database_config)。这样可以保证正确的导入和设置顺序。

db对象本身也归该模块model所有;如果我需要在其他地方使用它,我会导入model并使用model.db.

如果您想进一步分离事物(不同的模型类存在于不同的模块中),您可以拥有一个拥有的模块db,然后是您单独的模型模块,然后是导入db模型并提供setup功能的第三个模块。例如,您的目录结构可能如下所示:

  • model/
    • __init__.py-- 导入所有模型子模块并提供一个setup函数
    • db.py-- 提供db对象本身和其他人需要的任何公共实体对象
    • form1.py, form2.py, etc. -- 导入db并使用其数据库对象来定义实体

然后您的主应用程序可以执行以下操作:

import model
model.setup()
于 2018-09-20T02:07:45.363 回答