npm db-migrate SQLite3 Windows说明不匹配

问题描述:

我不知道把数据库放在哪里,因为说明是针对linux/mac的。我不知道在哪里运行迁移文件。这些说明对初学者来说不够好。我感到很困惑。我没有成功创建可以连接到的数据库。稍后,在说明中,教程将引导您使用db-migration创建数据库。耶,我认为这可能会有所帮助。不。我不能创建一个可以使用NodeJS连接到的SQLite数据库。npm db-migrate SQLite3 Windows说明不匹配

这是我到目前为止有:

database.json

{ 
    "test": { 
     "driver": "sqlite3", 
     "filename": "/data/keyword-wrangler2.test.sqlite" 
    }, 

    "dev": { 
     "driver": "sqlite3", 
     "filename": "/data/keyword-wrangler2.dev.sqlite" 
    }, 

    "production": { 
     "driver": "mysql", 
     "host": "localhost", 
     "user": "root", 
     "password": "root", 
     "database": "keyword_wrangler" 
    } 

} 

的指令具有文件名= “/var/tmp/keyword-wrangler.sqlite”。我们在Windows上没有/ var文件夹。我应该创建一个还是可以将数据库放在我想要的位置?

20160304212317-createKeywordAndCategoryTable.js

然后我跑这个命令:db-migrate create createKeywordAndCategoryTable --env test并根据指示所做的更改。以下是迁移文件:

'use strict'; 

var dbm = require('db-migrate'); 
var type = dbm.dataType; 
var async = require('async'); 
var seed; 

/** 
    * We receive the dbmigrate dependency from dbmigrate initially. 
    * This enables us to not have to rely on NODE_PATH. 
    */ 
exports.setup = function(options, seedLink) { 
    dbm = options.dbmigrate; 
    type = dbm.dataType; 
    seed = seedLink; 
}; 

exports.up = function(db, callback) { 
    async.series(
     [ 
      db.createTable.bind(db, 'keyword', { 
       id: { type: 'int', primaryKey: true, autoIncrement: true, notNull: true }, 
       value: { type: 'string', length: '128', notNull: true, unique: true }, 
       categoryID: { type: 'int', notNull: true } 
      }), 

      db.createTable.bind(db, 'category', { 
       id: { type: 'int', primaryKey: true, autoIncrement: true, notNull: true }, 
       name: { type: 'string', length: '128', notNull: true } 
      }) 
     ], callback); 
}; 

exports.down = function(db, callback) { 
    async.series(
     [ 
      db.dropTable.bind(db, 'keyword'), 
      db.dropTable.bind(db, 'category') 
     ], callback); 
}; 

根据我应该能够运行此命令的说明:db-migrate up --env test和文件应该被处理和数据库应该存在。

从哪里?如果我运行从我的项目的根文件夹中的命令,我收到此错误:

db-migrate up --env test 
[ERROR] Error: SQLITE_CANTOPEN: unable to open database file 
    at Error (native) 

如果我运行从我的项目的迁移文件夹中的命令,我收到此错误:

\migrations>db-migrate up --env test 
[ERROR] Error: Could not find database config file 'C:\Users\pdl\Projects\keyword-wrangler\keyword-wrangler3\migrations/database.json' 
    at Object.exports.loadFile (C:\Users\pdl\Projects\keyword-wrangler\keyword-wrangler3\node_modules\db-migrate\lib\config.js:45:11) 
    at loadConfig (C:\Users\pdl\Projects\keyword-wrangler\keyword-wrangler3\node_modules\db-migrate\api.js:508:18) 
    at Object.dbmigrate (C:\Users\pdl\Projects\keyword-wrangler\keyword-wrangler3\node_modules\db-migrate\api.js:67:17) 
    at Object.module.exports.getInstance (C:\Users\pdl\Projects\keyword-wrangler\keyword-wrangler3\node_modules\db-migrate\index.js:56:10) 
    at C:\Users\pdl\AppData\Roaming\npm\node_modules\db-migrate\bin\db-migrate:34:23 
    at C:\Users\pdl\AppData\Roaming\npm\node_modules\db-migrate\node_modules\resolve\lib\async.js:44:21 
    at ondir (C:\Users\pdl\AppData\Roaming\npm\node_modules\db-migrate\node_modules\resolve\lib\async.js:187:31) 
    at onex (C:\Users\pdl\AppData\Roaming\npm\node_modules\db-migrate\node_modules\resolve\lib\async.js:93:22) 
    at C:\Users\pdl\AppData\Roaming\npm\node_modules\db-migrate\node_modules\resolve\lib\async.js:24:18 
    at FSReqWrap.oncomplete (fs.js:82:15) 

有人可以请我知道我失踪的明显步骤或信息吗?

完全沮丧!

这是一个路径问题 - 在Windows上使用以Xnix为中心的工具的许多问题之一。 (我真的很同情你;我最近改用了Mac,所有这些问题都立即消失了)。如果你没有Mac或Linux机器的话,你可能会考虑使用Cygwin来解决这类问题。

你的DB-迁移错误信息开始时用:

Could not find database config file 'C:\Users\pdl\Projects\keyword-wrangler\keyword-wrangler3\migrations/database.json' 

看着你的GitHub project,我看你的database.json文件是在项目的根,而不是在你的迁移文件夹中。我没有一台Windows机器可以方便地自己测试,但您可以尝试将该database.json文件移动到您的migrations文件夹中,或从项目根目录运行迁移,并通过db-migrate指定迁移文件的路径docs

我希望这会有所帮助。

这个软件包游戏很麻烦,所以我想我会在这里添加我的答案,以防其他人遇到相同的问题。 对于第一个问题,您可以将数据库存储在任何需要的地方。我将数据库存储在项目的范围内,并将其添加到我的.gitignore中。

"dev": { 
     "driver": "sqlite3", 
     "filename": "db/dev.db" 
    }, 

在运行db:migrate之前,请确保您创建了“filename”属性中指定的文件。 db-migrate不会为你创建该文件。

对于你应该在哪里运行这些命令的主要问题。看看回购他们使用process.cwd()作为basePath。所以为你的“database.json”设置的路径应该与你调用db-migrate的地方相关。

例如,我有以下文件夹结构。

├── package.json 
├── config 
│ └── database.json 
└── db 
    ├── dev.db 
    └── migrations 

为了能够运行我的迁移,我在我的package.json中为脚本添加了一个脚本。

"db:rollback": "db-migrate --migrations-dir db/migrations --config config/database.json down --env dev", 

如果不指定--migrations-dir--config它会寻找同一目录db-migrate被调用内的文件。

以下是源代码中使用的默认值片段。

.default({ 
     verbose: false, 
     table: 'migrations', 
     'seeds-table': 'seeds', 
     'force-exit': false, 
     'sql-file': false, 
     'non-transactional': false, 
     config: internals.configFile || internals.cwd + '/database.json', //cwd -- current working directory 
     'migrations-dir': internals.cwd + '/migrations', 
     'vcseeder-dir': internals.cwd + '/VCSeeder', 
     'staticseeder-dir': internals.cwd + '/Seeder', 
     'ignore-completed-migrations': false 
    }) 

https://github.com/db-migrate/node-db-migrate/blob/master/lib/commands/set-default-argv.js

刚刚从

/data/keyword-wrangler2.dev.sqlite 

改变你的路径

./data/keyword-wrangler2.dev.sqlite 

,它会工作。对这两条路径进行更改。