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