Bookshelf.js/Knex.js中数据库架构加载的常见做法

4

ActiveRecord(来自Rails)和Sequelize(另一个node.js ORM)都提供了一种初始化数据库的方法,从模型定义中创建表结构。Rails通过rails db:schema:load命令执行此操作,而Sequelize具有执行相同操作的sync()方法。通过使用这种方法,我们不需要运行整个应用程序的迁移堆栈来启动新的数据库,也不需要在项目存储库中保存SQL转储。

出于这个背景,我希望Bookshelf.js或Knex.js拥有某种类似功能,但我在两个项目的文档中都找不到它。

然后我决定查看Ghost博客引擎的源代码,该引擎使用Bookshelf,我发现他们在自己的代码库中处理数据库初始化:

我希望避免编写自己的代码来特别处理这种情况,因为其他选项(如Sequelize)已经提供了这个功能。
在Bookshelf上加载数据库模式的常见做法、插件或库有哪些推荐的?
1个回答

1
我认为你走在了正确的道路上,可能只是错过了文档。

http://knexjs.org/#Migrations

要加载模式,如果迁移被编写为幂等,则可以运行迁移堆栈。

另一个选择是使用数据库的导出和导入功能。例如:https://www.postgresql.org/docs/9.1/static/app-pgdump.html

Rails通过具有两个rake任务db:schema:dump和db:schema:load来实现其迁移。Dump将在自定义Ruby格式的本地schema.rb文件中转储您的数据库模式。db:schema:load会加载该文件。

因此,您可以使用pg_dump和pg_restore以及npm软件包脚本来实现类似的功能。只需使脚本使用节点的exec方法调用pg_dump,并每次转储到同一文件即可。


谢谢你的回答!但是这些选项恰恰是我想要避免的。当一个应用程序变得庞大和复杂时,通过运行整个迁移栈来初始化新数据库通常是一个坏主意,并且将项目仓库更新为 SQL 转储也是一项重复性的任务,我不想将其添加到工作流程中。ActiveRecord 和 Sequelize 都有模式加载功能,可以很好地解决这个问题,所以我希望在 Bookshelf 中能找到类似的东西,但看起来并没有。 - Guilherme Sehn
Rails db:schema:load 的工作原理是加载每次运行迁移时转储的 schema.rb 文件。db:schema:dump 会替换该转储文件。因此,在某种程度上,Rails 还通过 SQL 转储来保持存储库的更新。 - chris
你可以很容易地通过使用npm脚本来使用pg_dump创建架构,使用pg_restore加载架构,并使用knex运行迁移的迁移脚本来实现Rails正在执行的相同操作,然后转储模式。每次模式转储时,覆盖相同文件并且架构加载脚本加载该文件即可。 - chris
听起来这是一个不错的解决方案!您能否将其添加到原始答案中,以便我可以接受它? - Guilherme Sehn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接