我是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
但我并没有真正了解这对我的代码意味着什么。
答案 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无法理解它所给出的命令行参数。具体来说,单选项标志和双选项标志一起使用不正确:
此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
最后是之后所有选项的最终参数。