从对象定义生成数据库表

Posted

技术标签:

【中文标题】从对象定义生成数据库表【英文标题】:Generating database tables from object definitions 【发布时间】:2010-09-06 22:44:07 【问题描述】:

我知道有几种(自动)方法可以创建数据访问层来操作现有数据库(LINQ to SQL、Hibernate 等...)。但是我有点厌倦了(我相信应该有更好的做事方式),比如:

    在 Visio 中创建/更改表格 使用 Visio 的“更新数据库”创建/更改数据库 将表导入“LINQ to SQL 类”对象 相应地更改代码 编译

从对象/实体定义生成数据库架构的方法怎么样?我似乎无法找到此类工具的良好参考(我希望至少在某些框架中提供某种内置支持)。

如果我能做到就完美了:

    更改对象定义 更改操作对象的代码 编译(数据库更改自动完成)

【问题讨论】:

【参考方案1】:

查看DataObjects.Net - 旨在完全支持这种情况。只有代码,没有别的。它的schema upgrade layer 可能是你能找到的最有特色的一个,它确实完全抽象了模式升级 SQL。

查看product video - 您会注意到没有进行任何额外的同步架构。架构升级示例显示了此功能的预期用途。

【讨论】:

相关答案:***.com/questions/1143525/… 顺便说一句,该产品确实让您感觉自己正在处理对象数据库。此外,它实际上提供了一个(目前 - 仅用于内存数据)。【参考方案2】:

您可能正在寻找Object Database。

【讨论】:

【参考方案3】:

我相信这是Microsofy Entity Framework 试图解决的问题。虽然不是专门为“编译(数据库更改是自动完成的)”而设计的,但它确实解决了处理域模型更改的问题,而无需大量依赖底层数据模型。

【讨论】:

【参考方案4】:

正如 Jason 所建议的,object db 可能是一个不错的选择。看看db4objects。

【讨论】:

这是一款非常好的产品。几乎是真实的......仍在等待捕获。 问题在于它是对象数据库,因此不基于高级关系模型。【参考方案5】:

你描述的是GORM。它是Grails 框架的一部分,旨在与Hibernate(将来可能是JPA)一起使用。当我第一次使用 Grails 时,它似乎倒退了。我更喜欢使用 Rails 风格的工作流程来制作表格并让框架从数据库模式生成脚手架。 GORM 为您保留域对象,以便您创建和更改对象,它管理数据库创建/更新。现在我已经习惯了,这更有意义。如果您不是在寻找新框架,很抱歉取笑您,但它位于 roadmap for release 1.1 以使 GORM 可独立使用。

【讨论】:

【参考方案6】:

当我们构建自己的框架 (Inon Datamanager) 的第一个版本时,我让它读取预先存在的 SQL 表并从中自动生成 Java 对象。

当我来自 Smalltalkish 背景的同事构建第二个版本时,他们从对象开始,然后自动生成表格。

实际上,他们完全忘记了 SQL 部分,直到我回来添加它。但是现在我们只是在应用程序启动时运行一个触发器,它迭代对象模型,检查表和所有正确的列是否存在,如果不存在则创建它们。很方便。

事实证明,这比您预期的要容易得多 - 如果您最喜欢的工具不支持类似的过程,您可能会在几个小时内编写它 - 假设关系到对象映射相对简单。

但重点是,这似乎取决于您在文化上是对象人还是数据库人 - 您可以将其中任何一个视为权威来源。

【讨论】:

【参考方案7】:

一些真正的大狗,例如ERwin Data Modeler,会反对DB。不过,您需要有大笔资金才能买得起该产品。

【讨论】:

【参考方案8】:

我一直在研究一些“主要”框架,似乎 Django 完全符合我的要求。或者从这个screencast看来是这样的。

有人对此有何评论吗?效果好吗?

【讨论】:

【参考方案9】:

是的,Django 运行良好。

是的,它将根据您的数据模型定义(用 python 编写)生成您的 SQL 表

如果您更新结构,它不会总是更改现有表,您可能需要手动运行 ALTER 表

Ruby on Rails 具有这些功能的更高级版本(Rails 迁移),但我不太喜欢该框架,我发现 ruby​​ 和 rails 非常独特

【讨论】:

【参考方案10】:

有点晚的答案,但它是这样的:

我遇到了完全相同的问题,并最终为它编写了自己的解决方案,但仅使用 .NET 和 SQL Server。它基本上确实实现了您描述的过程:

所有 DB 对象都保存为嵌入的 CREATE 脚本,作为源代码的一部分 使用数据访问功能时会自动(或根据请求)设置 DB 对象 所有非表格更改也会同时自动(或根据请求)执行 在升级数据库时也可以通过(手动创建的)更改脚本来执行表更改(可能需要特别注意迁移数据) 甚至可以检测到对任何数据库对象进行的手动更改,从而可以验证和纠正架构完整性 可选的轻量级 ORM 可以映射存储过程和对象以及结果集(甚至多个) 命令行应用程序有助于使 SQL 源文件与开发数据库保持同步

包含数据库的库在 LGPL 许可下是免费的。

http://code.google.com/p/bsn-modulestore/

【讨论】:

以上是关于从对象定义生成数据库表的主要内容,如果未能解决你的问题,请参考以下文章

从数据库表生成类

Cglib根据数据库表数据动态生成对象

.net 从数据库表运行时生成类

如何根据数据库中的表自动生成实体类

Oracle-数据表对象

从 python 生成 Faker 数据并将其加载到 BigQuery 嵌套表中