在这种情况下如何避免循环导入(Flask和SQLalchemy)?

时间:2013-07-01 11:21:07

标签: python sqlalchemy circular-dependency

我有一个使用SQLalchemy作为数据库的FLASK应用程序。

模型都在 models.py 中,我已经为大多数模型类的默认ORM属性和方法添加了几个属性和方法。 例如;我的“合约”模型有一个额外的属性contract.first_possible_termination,它返回一个日期。

问题是此属性访问实用程序模块,该模块具有计算日期范围的功能。该功能需要在“配置”表中使用存储在数据库中的不同配置选项。

因此,实用程序模块需要再次使用ORM模型,以访问配置表,因此我们有一个循环导入:

ImportError: cannot import name Configuration

我想知道在这里避免循环导入的标准方法是什么。我想更多的人会遇到这种情况,因为我会为一些模型添加方法和属性。

编辑,请注意:
我认为plantians回答是一般的最佳方式,因为它促进了SoC,但在我的具体情况下,我正在使用遗留数据库,该数据库具有影响跨数据库中不同表的业务规则的值。
我添加到模型中的许多功能将以某种方式依赖于这些值/业务规则,因此如果不进行大量重构并传递大量额外的外部信息,我将无法避免在这些函数中访问数据库值给我的辅助函数。

我只能接受一个答案,但两者都是有效的,所以两者都是有效的,但是Blubber的回答是我现在的个人解决方案。
感谢Blubber和Plantian。

2 个答案:

答案 0 :(得分:3)

您可以在模块内部而不是在模块顶部导入模块,模块只导入一次,因此不会造成性能问题。

您还可以尝试将配置模块导入移动到util模块的底部。

答案 1 :(得分:1)

另一种选择是将配置作为参数传递给实用程序函数。可能最好不要让您的实用程序直接依赖于模型。即

def get_range (start_at, strategy):
    pass

调用者(来自配置表)确定策略的位置。也许你的util函数的代码片段更易于构建。