我想在不同的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
中,但我如何将导入传递给底层模块?
答案 0 :(得分:0)
我不能说这是否是一个好主意,但是很容易让导入成为核心,因为模块是Java习语中的“单例”:它们共享状态。换句话说,您可以执行以下操作:
try:
from camelot import Integer, Numeric, ...
except ImportError:
from elixir import Integer, Numeric, ...
然后在另一个模块中
from dataProxy import Integer
并且你将在任何地方获得相同的类(在同一个解释器会话中,即)。这个习惯用法通常用于配置文件,因为你可以写例如在settings.py
中设置代码,然后您应用的其余部分就可以访问该代码的结果。