在不同的pythom模块之间共享PonyORM的数据库会话

时间:2018-09-13 06:51:37

标签: python ponyorm

我最初开始了一个小型python项目(Python,Tkinter amd PonyORM),后来变得更大,这就是为什么我决定将代码(仅用于单个文件)划分为几个模块(例如main,form1,实体,数据库)的原因。 Main充当主控制器,form1作为示例可以包含一个tkinter框架,该框架可以用作用户可以在其中输入数据的接口,实体包含db.Enttiy映射和pony.Database实例的数据库及其连接详细信息。我认为问题是,在导入期间,出现此错误“ pony.orm.core.ERDiagramError:无法定义实体'EmpInfo':数据库映射已生成”。您能指出我现有的任何代码吗?

2 个答案:

答案 0 :(得分:0)

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

我认为您应该在所有导入都完成后输入db.generate_mapping()之前致电tk.mainloop()

答案 1 :(得分: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的模块,然后是单独的模型模块,然后是一个导入{{1 }}和模型,并提供db函数。例如,您的目录结构可能如下所示:

  • setup
    • model/-导入所有模型子模块并提供__init__.py函数
    • setup-提供db.py对象本身以及其他所有人需要的所有公共实体对象
    • dbform1.py等-导入form2.py并使用其数据库对象定义实体

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

db