Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 自动化/跟踪Knex迁移和Lucid模型_Node.js_Postgresql_Orm_Knex.js_Adonis.js - Fatal编程技术网

Node.js 自动化/跟踪Knex迁移和Lucid模型

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(迁移管理器)。您也不在模型上定义字段属性,这有利于在前端和后端动态执行操作。综合考虑,存在大量人为错误、沟通失误和需要更多打字的船只。我知

形势 我最近开始使用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?如何不仅检查需要添加到上下字段的内容,还检查是否需要更改字段的属性。
编辑:我只想写一篇文章。以及相应的向下滚动

大问题 基本上,我如何定义脏的“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个迁移