使用Elixir有哪些好处
... 和声明式 SQLAlchemy 有什么区别?
3 个回答
我觉得Elixir的语法在从零开始为一个应用程序建立数据库时非常有用,因为在开始之前所有的事情都已经想清楚了。
我在使用SQLAlchemy处理旧数据库时效果最好,尤其是那些结构基本不变的数据库。特别有用的是一个叫SQLSoup的插件,它可以帮助我们一次性读取数据,为将数据迁移到其他地方做准备。
当然,每个人的情况不同,但我觉得Elixir并不是特别适合用来适应旧的数据库结构,而SQLAlchemy对于大多数小型到中型项目来说,功能有点过于复杂了(这只是我个人的看法)。
可以说,Elixir的出现是因为有些人觉得SQLAlchemy不够直观。
来自Elixir网站的信息:
Elixir的目的是替代ActiveMapper这个SQLAlchemy的扩展和TurboEntity项目,但并不打算取代SQLAlchemy的核心功能。相反,它专注于提供一种更简单的语法来定义模型对象,特别是在你不需要SQLAlchemy手动映射器所有复杂功能的时候。
我在这里开始了一份清单,列出了elixir和sqlalchemy在实际(技术)上的区别和优点,但我不确定我的说法是否正确,因为我对sqlalchemy的了解非常有限(我只用到elixir和sqlalchemy的一小部分)。
如果能在回答中提供sqlalchemy的代码示例和elixir的对应示例,那就太好了,这样可以更清楚地展示它们之间的区别,就像在stackoverflow上有些比较问题的回答一样(比如mako和jinja2的比较)。
无论如何,这是我的清单,如果有人能纠正我(纠正我对sqlalchemy的假设),我会非常感激。
Elixir实现了主动记录模式,旨在替代ActiveMapper这个sqlalchemy的扩展。(这是不是过时了:sqlalchemy赶上来了?)
模型之间的关系更清晰:一对多、多对一、多对多和一对一的关系比sqlalchemy的关系要明显得多。你一眼就能看出模型之间的关系。
继承在elixir中比在sqlalchemy中更方便。因为你是从类派生的,所以更容易看出来。在sqlalchemy中,你需要调整_with_polymorphisme和polymorphic_on属性。
关于继承:在elixir中,表、列和外键会自动创建,而在sqlalchemy中则不会。(这是真的吗?)
Elixir会自动为所有表创建一个ID列(如果没有声明其他主键的话)。
Elixir会自动为关系创建外键,而sqlalchemy似乎没有这样做?
在elixir中,大多数情况下,你不需要在关系中指定backref。而在sqlalchemy中,你总是需要这样做?
Elixir有一个版本控制扩展(sqlalchemy没有?)
Elixir有一个关联扩展,可以创建多对多关系,并提供很好的select_by_XXX方法,其中XXX是“关联”类的名称。sqlalchemy似乎没有这种扩展?
在elixir中,继承关系是透明的。而在sqlalchemy中就不是,你需要这样做:http://www.sqlalchemy.org/docs/reference/ext/declarative.html#mixing-..。