【发布时间】:2011-04-26 20:31:32
【问题描述】:
... vs 声明性 sqlalchemy ?
【问题讨论】:
标签: python sqlalchemy python-elixir
... vs 声明性 sqlalchemy ?
【问题讨论】:
标签: python sqlalchemy python-elixir
你可以说 Elixir 的诞生是因为 SQLAlchemy 对某些人来说声明性不够。
来自Elixir 网站:
Elixir 旨在取代 ActiveMapper SQLAlchemy 扩展,以及 TurboEntity 项目,但没有 打算替换 SQLAlchemy 的核心 功能,而是专注于 提供更简单的语法 不定义模型对象 需要充分的表现力 SQLAlchemy 的手动映射器 定义。
【讨论】:
Elixir 语法在我从头开始为给定应用程序构建数据库时很有用,而且一切都是事先弄清楚的。
在遗留数据库(以及其他类似的逻辑不可变模式)上使用 SQLAlchemy 时,我遇到了最好的运气。 SQLSoup 插件特别有用,用于一次性提取只读数据,以准备将其迁移到其他地方。
YMMV,但 Elixir 并不是真正为适应旧模式而设计的——而且对于大多数中小型项目来说,SQLAlchemy 本身就太过分了(当然在我看来)。
【讨论】:
我有started a list here 关于 elixir 与 sqlalchmey 的实际(技术)差异/优势,但我不知道我的说法是否正确,因为我对 sqlalchemy 的了解非常有限(我使用了非常小的一部分 elixir和 sqla)。
答案在 sqla 中显示代码示例并在 elixir 中显示相同的代码示例以显示差异,这将是非常明智的,因为在 stackoverflow 中回答了一些比较问题(例如,我认为 mako 与 jinja2)
无论如何,这是我的清单,如果有人纠正我(纠正我对 sqlalchemy 的假设),我将不胜感激
Elixir 实现了 Active Record 模式,旨在替换 ActiveMapper SQLAlchemy 扩展。 (过时了:sqlalchemy 赶上了?)
黑白模型的关系很清晰(呃):OneToMany、ManyToOne、ManyToMany 和 OneToOne 比 sqla 的关系更清晰。一目了然,您可以看到模型之间的关系。
继承比 sqlalchemys 更方便。由于您从类派生,因此它也更加明显。在 sqla 中,您必须调整 with_polymorphisme 和 polymorphic_on 属性。
继承:在 elixir 中,表、列和外键是自动创建的,但在 sqlalchemy 中不是。 (100% 正确吗?)
Elixir 自动为所有表创建一个 ID 列(如果没有声明其他 primary_key)
Elixir 自动为关系创建 FK,sql 不会 (?)
在 elixir 中,大多数时候,您不必在关系中指定 backref。在 sqla 中,您总是必须 (?)
Elixir 有版本控制扩展(sql 没有?)
Elixir 有一个关联扩展,可以创建多对多关系并提供不错的 select_by_XXX 方法,其中 XXX 是“关联”类的名称。 Sqla 没有这种扩展(?)
继承关系在 Elixir 中是透明的。在 sqla 中,它不是,你必须这样做:http://www.sqlalchemy.org/docs/reference/ext/declarative.html#mixing-..。)
【讨论】: