我有一个使用SQLalchemy作为数据库的FLASK应用程序。
模型都在 models.py 中,我已经为大多数模型类的默认ORM属性和方法添加了几个属性和方法。 例如;我的“合约”模型有一个额外的属性contract.first_possible_termination,它返回一个日期。
问题是此属性访问实用程序模块,该模块具有计算日期范围的功能。该功能需要在“配置”表中使用存储在数据库中的不同配置选项。
因此,实用程序模块需要再次使用ORM模型,以访问配置表,因此我们有一个循环导入:
ImportError: cannot import name Configuration
我想知道在这里避免循环导入的标准方法是什么。我想更多的人会遇到这种情况,因为我会为一些模型添加方法和属性。
编辑,请注意:
我认为plantians回答是一般的最佳方式,因为它促进了SoC,但在我的具体情况下,我正在使用遗留数据库,该数据库具有影响跨数据库中不同表的业务规则的值。
我添加到模型中的许多功能将以某种方式依赖于这些值/业务规则,因此如果不进行大量重构并传递大量额外的外部信息,我将无法避免在这些函数中访问数据库值给我的辅助函数。
我只能接受一个答案,但两者都是有效的,所以两者都是有效的,但是Blubber的回答是我现在的个人解决方案。
感谢Blubber和Plantian。
答案 0 :(得分:3)
您可以在模块内部而不是在模块顶部导入模块,模块只导入一次,因此不会造成性能问题。
您还可以尝试将配置模块导入移动到util模块的底部。
答案 1 :(得分:1)
另一种选择是将配置作为参数传递给实用程序函数。可能最好不要让您的实用程序直接依赖于模型。即
def get_range (start_at, strategy):
pass
调用者(来自配置表)确定策略的位置。也许你的util函数的代码片段更易于构建。