0

我想在不同的Elixir / SQLAlchemy应用程序之间共享我的数据模型,其中一个是Camelot UI 和其他东西,如 Web 界面等。它们都将连接到同一个底层数据库。

据我所知,要构建一个 Camelot 应用程序,我的模型会这样做from camelot import blah,这将阻止它在没有安装 Camelot 的任何环境中运行。

我想知道是否有推荐的方法/最佳实践来做到这一点。这个想法当然是为我的模型维护一个单一的代码库,而不是在不同应用程序之间以细微的差异来复制它(比如从这里从 SA/Elixir 导入,从那里从 Camelot 导入,等等)。

我的项目目前使用模型/ python 包进行布局:

model/__init__.py
      foo.py
      bar.py
      ...

init .py 看起来像这样:

from foo import a, b, c 
from bar import d, e, f 
__all__ = ('a', 'b', 'c', 'd', 'e', 'f') 

而python模块foo.py、bar.py等实际上实现了各个部分。这些模块中的每一个都是这样开始的:

from sqlalchemy import Integer, Numeric, Date, Unicode, LargeBinary 
from elixir import Entity, Field, ManyToOne, OneToMany, ManyToMany 
from elixir import using_options 

一个想法可能是做类似的事情:

try:
    from camelot import Integer, Numeric, ...
except ImportError:
    from elixir import Integer, Numeric, ...

这实际上是一个主意还是我错过了什么?另外,理想情况下,我会在某个中心位置(例如 in )执行那种“环境初始化”的工作model/__init__.py,但是我如何将导入传递给底层模块呢?

4

1 回答 1

0

我不能说这是否是一个好主意,但很容易使导入成为中心,因为模块在 Java 成语中是“单例”:它们共享状态。换句话说,您可以执行以下操作:

数据代理.py

try:
    from camelot import Integer, Numeric, ...
except ImportError:
    from elixir import Integer, Numeric, ...

然后在不同的模块中做

from dataProxy import Integer

并且您将在任何地方获得相同的课程(即在同一个解释器会话中)。这个习惯用法通常用于配置文件,因为您可以在 a 中编写例如设置代码,settings.py然后您的应用程序的其余部分将可以访问该代码的结果。

于 2010-10-14T15:20:56.773 回答