在Camelot和非Camelot应用程序之间共享模型

时间:2010-10-14 14:39:26

标签: python sqlalchemy python-elixir

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

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

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

我的项目目前使用model / 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, ...

这实际上是一个好的想法还是我缺少的东西?另外,理想情况下我会在某些中心位置执行这种“环境初始化”操作,例如在model/__init__.py中,但我如何将导入传递给底层模块?

1 个答案:

答案 0 :(得分:0)

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

dataProxy.py

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

然后在另一个模块中

from dataProxy import Integer

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