createdb:命令行参数太多

时间:2015-06-10 21:46:05

标签: ruby windows postgresql activerecord

我是Ruby和Web开发的新手。我正在使用Windows 7 64位与Ruby 2.0,我安装了PostgreSQL 9.4。

我正在尝试使用ActiveRecord创建数据库。我检查了我的postgresql服务器正在运行,我做了捆绑安装,以确保我有所有必需的宝石。当我运行“bundle exec rake db:create”时,看起来rake能够在PostgreSQL目录中找到createdb.exe,但由于某种原因,它告诉我有太多的命令行参数:

C:\Users\MH\Desktop\activerecord-template> bundle exec rake db:create
Creating activerecord-template development and test databases if they don't exist...
'createdb': too many command line-arguments (first is "postgres")

我的Gemfile,Rakefile和config.rb文件在我之前的帖子中:createdb not recognized as a command when using ActiveRecord

我认为这个问题可能出现在Rakefile中:

desc "Create #{APP_NAME} databases"
      task "create" do
        puts "Creating #{APP_NAME} development and test databases if they don't exist..."
        system("createdb #{DB_NAME} --username #{DB_USERNAME} -w --no-password && createdb #{TEST_DB_NAME} --username #{DB_USERNAME} -w --no-password")
      end

我尝试删除并更改此处引用的-w的顺序:pg_dump: too many command line arguments,但这并未解决问题。

还有一些关于将“你的选项放在你的无选择参数之前”以及这些链接中选项的错误顺序的讨论:

http://grokbase.com/t/postgresql/pgsql-general/07avnzajn7/createdb-argument-question

http://postgresql.nabble.com/pgpass-does-not-work-for-createlang-td2118667.html

但我并没有真正了解这对我的代码意味着什么。

3 个答案:

答案 0 :(得分:0)

由于您使用的是Windows,因此该行的语法可能存在问题:

system("createdb #{DB_NAME} --username #{DB_USERNAME} -w --no-password && createdb #{TEST_DB_NAME} --username #{DB_USERNAME} -w --no-password")

如果Ruby使用默认的Windows cmd.exe来运行命令,&&运算符将无效。

我可能会将其分为两个陈述:

ok   = system("createdb #{DB_NAME} --username #{DB_USERNAME} -w --no-password")
ok &&= system("createdb #{TEST_DB_NAME} --username #{DB_USERNAME} -w --no-password")
# ...can check "ok" for success of both calls if you like...

最后,如果问题仍然存在,那么PATH中必须有另一个createdb可执行文件,它在Postgres二进制文件路径之前被命中。您可以尝试system("path")并查看输出结果,并检查这些目录是否存在冲突的createdb

答案 1 :(得分:0)

Rakefile“create”任务使用PostgreSQL中的createdb.exe。 system()接受createdb.exe的选项。这些资源中描述了这些选项:

对于这个特定的Rakefile,选项标志的格式不正确,因此createdb.exe无法理解它所给出的命令行参数。具体来说,单选项标志和双选项标志一起使用不正确:

  • - 用户名必须设置为等于值
  • -w和--no-password意味着同样的事情并且是多余的。如果要使用此选项标志,则应使用其中一个,但不能同时使用这两个。

此Rakefile中system()的正确语法是:

system("createdb #{DB_NAME} --username=#{DB_USERNAME} && createdb #{TEST_DB_NAME} --username=#{DB_USERNAME}")

您可以保留-w或--no-password标志,但如果继续收到有关命令行参数的命令终端错误,请完全删除这两个标志,如上所示,让命令终端问你对于postgres服务器的密码,默认情况下是这样做的。

答案 2 :(得分:0)

我刚刚在Windows 7机器上完成了这项工作。

正确答案是:

system("createdb --no-password --username=#{DB_USERNAME} #{DB_NAME} && createdb --no-password --username=#{DB_USERNAME} #{TEST_DB_NAME} ")

我从你的帖子和阅读dbcreate --help得到了这个。争论的顺序是错误的;请注意DB_NAME最后是之后所有选项的最终参数。