簡體   English   中英

在我的 Node.js 應用程序中使用 Knex.js 刪除遷移

[英]Removing Migrations With Knex.js In My Node.js Application

我正在嘗試讓 knex 在我的 node.js 應用程序中工作。 我正在學習教程,並在某個時候創建​​了一個表格,但無法重復該過程。 我刪除了表格並刪除了所有遷移文件夾。 在這一點上,我重新開始,但是在創建新的遷移然后運行knex migrate:latest我收到一條錯誤消息,說遷移目錄已損壞,因為我的原始遷移丟失了。

我的印象是,如果文件丟失,它不應該知道它曾經存在過。

從我的項目中刪除遷移的正確方法是什么?

knexfile.js

 development: {
    client: 'pg',
    connection: {
    host: '127.0.0.1',
    user:     'postgres',
    password: 'password',
    database: 'myDatabase'
    },
     pool: {
      min: 10,
      max: 20
    },
    migrations: {
      directory: __dirname + '/db/migrations'
    },
    seeds: {
      directory: __dirname + '/db/seeds/development'
    }

數據庫.js

var config      = require('../knexfile.js');  
var env         = 'development';  
var knex        = require('knex')(config[env]);

module.exports = knex;
console.log('Getting knex');
knex.migrate.latest([config]); 
console.log('Applying migration...');

運行這個會出錯,

knex migrate:latest

Using environment: development
Error: The migration directory is corrupt, the following files are missing: 20161110130954_auth_level.js

但是這個遷移不存在,因為我刪除了它。

在刪除文件之前,您必須回滾遷移( knex migrate:rollback ),我想您可以做的是:

touch [full_path_to_migrations_here]/migrations/20161110130954_auth_level.js

knex migrate:rollback

rm [full_path_to_migrations_here]/migrations/20161110130954_auth_level.js

參考這里https://github.com/tgriesser/knex/issues/1569

您的遷移文件已被刪除,但它們仍在名為“遷移”的表中被引用
(見下面的更新),它是由 knex 生成的。

您應該能夠通過連接到本地數據庫來檢查它。

我遇到了同樣的問題,我通過刪除與我刪除的遷移文件對應的記錄來解決它。

delete from migrations
where migrations."name" in ('20191027220145_your_migration_file.js', ...);

編輯:遷移表名稱可能會根據選項或您使用的版本而更改。
該常數設置 在這里和使用存在
為了確定名稱,您可以按照@MohamedAllal 的建議列出所有表

希望它有幫助

刪除任何一個,您可以回滾,然后回滾然后刪除。

或者你不能! 並按照以下內容進行操作:

(> 在下面,請回答以下您可能已經看到的錯誤:<)

錯誤:遷移目錄已損壞

如果

遷移文件被刪除,而 knex 創建的遷移表上的記錄保留在那里!

所以只需清除它們!

(刪除然后清理,或清理然后刪除!)

重要的是要注意現在的遷移表是knex_migration 不知道是不是和以前不一樣了!

但最好列出數據庫表以確保!

我正在使用 postgres! 使用 psql :

> \d

我明白了:

在此處輸入圖片說明

您可以使用原始 SQL 做到這一點! 使用您的數據庫終端客戶端,或使用 knex 本身! 或任何其他方式(編輯器客戶端(pgAdmin、mysql 工作台等)。

原始 sql

DELETE FROM knex_migration
WHERE knex_migration."name" IN ('20200425190608_yourMigFile.ts', ...);

請注意,您可以復制錯誤消息中的文件(如果收到)

例如: 20200425190608_creazteUserTable.ts、20200425193758_createTestTestTable.ts

來自

錯誤:遷移目錄已損壞,缺少以下文件:20200425190608_creazteUserTable.ts、20200425193758_createTestTestTable.ts

復制過去! 而且速度很快!

(您可以通過嘗試遷移來獲得錯誤)

使用 knex 本身

knex('knex_migration')
    .delete()
    .whereIn('name', ['20200425190608_yourMigFile.ts', ...]);

創建腳本! 調用您的 knex 實例! 完成! 酷!

清洗后

在此處輸入圖片說明

遷移將運行良好! 並且您的目錄不再損壞! 我是多么喜歡那個綠色!

快樂編碼!

刪除遷移:(將其關閉然后刪除以刪除)

刪除遷移的正確方法是什么?

答案是將那一次遷移降下來,然后刪除它的文件!

插圖

$ knex migrate:down "20200520092308_createUsersWorksTable.ts"

$ rm migrations/20200520092308_createUsersWorksTable.ts

在此處輸入圖片說明

您可以列出要檢查的遷移,如下所示

$ knex migrate:list

(來自 v0.19.3!如果不可用更新 knex ( npm i -g knex ))

將遷移更改為僅更改(否)

如果你和我一樣喜歡在基礎遷移中直接更新遷移! 您可能會考慮創建另一個遷移! 運行它然后刪除它!

一個快速的流量! 您只需在基本創建表上進行更新! 將過去復制到新創建的更改表中! 運行它然后刪除它!

如果你是這樣想的! 不要!!!

無法回滾,因為這是您想要的更改! 你不能取消它們!

你可以做到! 然后你必須清除記錄! 否則你會得到錯誤! 而且不酷!

最好創建一個以后的文件腳本! 不是遷移文件! 然后直接運行! 完成!

我的偏好是在 Database 文件夾中創建一個alter.ts (.js) 文件! 然后在那里創建更改模式代碼! 並創建一個 npm 腳本來運行它!

在此處輸入圖片說明

每次你只要修改它! 跑!

這里的基礎骨架:

import knex from './db';

(async () => {
    try {
        const resp = await knex.schema.alterTable('transactions', (table) => {
            table.decimal('feeAmount', null).nullable();
        });
        console.log(resp);
    } catch (err) {
        console.log(err);
    }
})();

使用 vscode 更好,我只使用運行代碼(如果安裝了運行代碼擴展!這是必須的 hhhh)!

在此處輸入圖片說明

如果沒有錯誤,那么它運行良好! 您可以檢查響應!

您可以在文檔中查看架構 api

另外要改變你需要使用alter()方法,就像我從文檔中獲取的下面的代碼片段一樣:

// ________________ alter fields
// drops previous default value from column, change type
// to string and add not nullable constraint
table.string('username', 35).notNullable().alter();
// drops both not null constraint and the default value
table.integer('age').alter();

現在快樂編碼!

由於您正在使用種子和遷移文件進行開發,因此您可以重新創建表和數據,因此您可以使用可用的 knex 遷移刪除並重新創建數據庫。

我的開發環境使用 sqlite,所以終端上的rm -rf dev.sqlite3修復了這個問題。

使用 postgresql 它將在終端上是dropdb "db_name"查看此以獲取更多替代方案。

這很簡單,之后不需要回滾

有關舊遷移的記錄已消失,您可以使用新的knex migrate:latest重新創建它。

如果在 Heroku 上使用 postgresql 導航到數據庫憑據並單擊“重置數據庫”按鈕有效

您可以通過運行此命令來重置數據庫。

Heroku run pg:reset --confirm app-name

熱修復

問題正在發生,因為刪除的遷移仍然是數據庫中的knex_migrations表,因此knex_migrations表與工作目錄中的遷移文件不匹配。 您必須從knex_migrations表中刪除遷移。

從 knex_migrations km 中刪除,其中 km."name" = 'deleted_migration.js'

嘗試使用下面的選項,它將完全按照它所指的去做:

migrations: {
 disableMigrationsListValidation: true,
}

knex.js 遷移 api

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM