Node.js 自动化/跟踪Knex迁移和Lucid模型
形势 我最近开始使用nodejs进行一个新项目。我有使用Python/Django和C#/.NET的背景(不太喜欢后者)。Node非常棒,但我必须说,我怀念在Django中构建模型和自动化迁移的简单性。我目前正在使用利用Knex的AdonisJS框架。Knex是一个功能强大的库,但所有迁移都需要手动构建。此外,管理模型的AdonisJS ORM独立于Knex(迁移管理器)。您也不在模型上定义字段属性,这有利于在前端和后端动态执行操作。综合考虑,存在大量人为错误、沟通失误和需要更多打字的船只。我知道现在最热门的事情是保持它的松散性和快速性,但是对于这个特定的项目,我正在寻找比松散定义的模型更具结构的模型 当前状态 我的目标是构建一个名为tableModel的新类和一个field类来定义表模型中的字段。我已经完成了这项工作,我正在利用Mustach成功地编写迁移文件。我还计划自动编写我不应该有问题的模型(祈求好运) 问题 这里有点困难,我需要帮助…我需要跟踪通过迁移添加或删除的内容,以便随着时间的推移,随着表格模型的变化,我可以有效地记录上下变化 假设我添加了一个“tableModel”,它创建了一个迁移来创建表Foo,其中包含字段{id(bigint)、user_id(int)、name(string255)} 稍后我想添加一个名为description的字段,这样我就可以简单地将它添加到我的“tableModel”中,然后运行一个build命令来构建迁移。 如何检查已创建的内容,以便只对其进行up()描述 然后我想删除name字段,所以我在“tableModel”中标记它,并运行构建迁移命令。如何检查现在需要添加到down()中的已迁移内容。 编辑:我将向上添加一个删除字段,并向下添加相应的回滚 奖金回合 假设我想把user_id从int改为bigint,因为谁把外键变成int?如何不仅检查需要添加到上下字段的内容,还检查是否需要更改字段的属性。Node.js 自动化/跟踪Knex迁移和Lucid模型,node.js,postgresql,orm,knex.js,adonis.js,Node.js,Postgresql,Orm,Knex.js,Adonis.js,形势 我最近开始使用nodejs进行一个新项目。我有使用Python/Django和C#/.NET的背景(不太喜欢后者)。Node非常棒,但我必须说,我怀念在Django中构建模型和自动化迁移的简单性。我目前正在使用利用Knex的AdonisJS框架。Knex是一个功能强大的库,但所有迁移都需要手动构建。此外,管理模型的AdonisJS ORM独立于Knex(迁移管理器)。您也不在模型上定义字段属性,这有利于在前端和后端动态执行操作。综合考虑,存在大量人为错误、沟通失误和需要更多打字的船只。我知
编辑:我只想写一篇文章。以及相应的向下滚动 大问题 基本上,我如何定义脏的“tableModels”类 可能的解决方案? 我在想,也许我应该捕获某种类型的注册表或快照,然后在构建迁移和/或模型时运行比较,然后重新捕获/快照。如果这是路由,我应该存储在json文件中,将其写入DB本身,还是有其他/更好的选项 如果我将tableModel实例创建为常量,那么我是否真的可以写回JS文件并将快照捕获为属性?如果这是一个选项,那么Node的文件系统是一个好方法吗?最好的方法是什么?Node一直让我惊讶,所以如果有任何一个选项,我都不会感到困惑 救命强> 如果以前有人走过这条路,或者知道我可以利用的任何工具,我将非常感激,并提前向您表示感谢。此外,如果我的方向完全错误,请让我知道,我处理并感谢所有类型的反馈 示例 需要注意的是,当我为给定的迁移或模型定义“tableModel”时,它是类的一个实例,我没有创建扩展类,因为这不是我的orm
class tableModel {
constructor(tableName, modelName = tableName, fields = []) {
this.tableName = tableName
this.modelName = modelName
this.fields = fields
}
// Bunch of other stuff
}
fooTableModel = new tableModel('fooTable', 'fooModel', fields = [
new tableField.stringField('title'),
new tableField.bigIntField('related_user_id'),
new tableField.textField('description','Testing Default',false,true)
]
)
这相当于:
tableModel {
tableName: 'fooTable',
modelName: 'fooModel',
fields:
[ stringField {
name: 'title',
type: 'string',
_unique: false,
allow_null: null,
fieldAttributes: {},
default_value: null },
bigIntField {
name: 'related_user_id',
type: 'bigInteger',
_unique: false,
allow_null: null,
fieldAttributes: {},
default_value: 0 },
textField {
name: 'description',
type: 'text',
_unique: false,
allow_null: true,
fieldAttributes: {},
default_value: 'Testing Default' } ]
您将
向上
和向下
符号混淆。这些用于迁移“最新”(运行up
函数)和执行回滚(运行down
函数)。“向上”和“向下”与删除或添加表列无关
向上迁移用于任何更改,向下迁移用于反转这些更改。因此,如果您想从某个表中删除一列,您可以在向上
中编写命令,然后在向下
中编写相反的命令(您可以将其添加回…),这样您就可以“回滚”并且更改被有效地反转。但是,您必须小心处理这些事情,因为您可能会将自己置于实际丢失数据的情况下
要添加列吗?将其写在上
,然后将该列放到下
迁移机制背后的一个要点是随着时间的推移跟踪数据库的更改状态。因此,通常情况下,如果您在某些迁移中创建了一个表,那么一天左右之后您就会意识到需要删除/添加列,您通常不会返回并编辑现有的迁移,尤其是在迁移已经运行的情况下。您只需编写一个新的迁移来删除/添加列
因为您使用的是knex,所以创建了几个“knex”表。默认情况下,您要查找的是knex_migrations
,除非有人专门修改了设置以更改其名称。此表按批次保存针对您的数据库运行的所有迁移。在CLI中,假设全局安装了knex.js,则可以运行knex migrate:latest
,这将把目录中存在的所有迁移推送到目标数据库(如果尚未运行)。它是通过检查knex_迁移
表来实现的。如果您滚动一个更改并且不喜欢它,并且假设您已经正确地完成了down
功能,您可以调用knex migrate:rollback
来反转更改。如果有3个迁移