类似于Entity Framework的ORM NOT for .NET

时间:2009-08-16 07:03:56

标签: php python entity-framework open-source

我真正喜欢的Entity框架是它的组合应用程序的整个模型层的拖放方式。你选择了表,它加入了它们,你就完成了。如果您更新数据库scheda,请右键单击 - >更新,你又完成了。

这似乎比竞争对手的ORM领先一步,比如Hibernate需要的XML(n)或者难以更新的Django模型。

没有专注于有时可能对映射过程有更多控制的事实,对于其他(主要是开源如python或php)编程语言或框架是否有类似的一键式(或单命令)解决方案?

由于

3 个答案:

答案 0 :(得分:2)

SQLAlchemy数据库反射让你到了一半。您仍然需要声明您的类和它们之间的关系。实际上你也可以很容易地自动生成类,但你仍然需要以某种方式命名关系,所以你也可以手动声明类。

设置数据库的代码如下所示:

from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base

metadata = MetaData(create_engine(database_url), reflect=True)
Base = declarative_base(metadata)    

class Order(Base):
    __table__ = metadata.tables['orders']

class OrderLine(Base):
    __table__ = metadata.tables['orderlines']
    order = relation(Order, backref='lines')

在生产代码中,您可能希望以某种方式缓存反射的数据库元数据。比如将它腌制成文件:

from cPickle import dump, load
import os

if os.path.exists('metadata.cache'):
    metadata = load(open('metadata.cache'))
    metadata.bind = create_engine(database_url)
else:
    metadata = MetaData(create_engine(database_url), reflect=True)
    dump(metadata, open('metadata.cache', 'w'))

答案 1 :(得分:2)

我不喜欢“拖放”创建数据访问代码。

乍一看似乎很容易,但随后您对数据库进行了更改,并且必须更新数据访问代码。这是变得困难的地方,因为您经常需要重做以前所做的事情,或者手动编辑拖放设计器创建的代码。通常当您使用拖放设计器更改一个字段映射时,输出文件具有不相关的行更改,因此您无法使用源代码控制系统来确认您已进行了预期的更改(而不是更改其他任何内容)

然而,每次您编译代码或更改数据库架构时,必须创建/编辑xml配置文件都不是很好,您必须更新映射文件。也很难开始映射文件并追踪看似简单问题可能需要很长时间的事情。

还有两个选择:

使用像CodeSmith这样的代码生成器,它为许多ORM系统提供模板。当(不是如果)您需要自定义输出时,您可以编辑模板,但简单的情况将由您负责。这样您就可以在每次更改数据库模式时重新运行代码生成器并获得可重复的结果。

和/或使用流畅的界面(例如Fluent NHibernate)来配置您的ORM系统,这避免了对Xml配置文件的需要,并且在大多数情况下您可以使用命名约定将字段链接到列等。这将更难以开始使用拖放式设计器,但如果你匹配代码或数据库的重构,将会长期支付费用。

另一种选择是使用从中生成数据库和代码的模型。 “模型”是您的源代码,并保持在版本控制之下。这称为“模型驱动开发”,如果您有许多具有更简单模式的类,则可能会很棒,因为您只需要为每个模式创建一次模板。

答案 2 :(得分:0)

我听说iBattis很好。当他们的程序员团队无法理解Hibernate(时间问题)时,一些公司会回归到iBattis。

就个人而言,我仍然喜欢 Linq2Sql 。是的,第一次有人需要删除和重新划分表似乎太多的工作,但事实并非如此。保存时不更新类代码的时间真的很痛苦,但你只需控制一个表并再次拖动它们。总重拍非常快速且无痛。它创建的类非常简单。如果您喜欢使用SP进行CRUD,您甚至可以创建多个表实体。

将SP链接到CRUD与EF类似:您只需使用与表格相同的参数设置SP,然后将其拖到表格上,然后将其与数据类型匹配。

很多人不遗余力地将IQueryable从存储库中取出,但你可以限制你在linq2Sql中链接的内容,所以IQueryable也不错

想一想,我想知道是否有办法限制关系(和外键)。