npm db-migrate SQLite3 Windows说明不匹配

时间:2016-03-04 23:13:32

标签: node.js sqlite npm

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

这是我到目前为止所做的:

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"
    }

}

说明文件名为filename =“/ 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)

有人可以告诉我有关我缺少的明显步骤或信息吗?

完全沮丧!

3 个答案:

答案 0 :(得分:1)

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

您的db-migrate错误消息以:

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

查看您的GitHub project,我发现您的 database.json 文件位于项目根目录,而不是迁移文件夹中。我没有自己的Windows机器进行测试,但您可以尝试将该database.json文件移动到迁移文件夹中,或者从项目根目录运行迁移并通过db指定迁移文件的路径-migrate docs

我希望这会有所帮助。

答案 1 :(得分:1)

这个包给了我很多麻烦所以我想我会在这里添加我的答案以防其他人遇到一些相同的问题。 对于第一个问题,您可以将数据库存储在任何您想要的位置。我将数据库存储在项目范围内,并将其添加到我的.gitignore。

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

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

关于您应该运行这些命令的主要问题。看一下repo,他们使用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

答案 2 :(得分:1)

只需改变你的路径

/data/keyword-wrangler2.dev.sqlite

./data/keyword-wrangler2.dev.sqlite

它会起作用。对两条路径都进行此更改。