Rails 4 - MS SQL select *语句返回总计数

时间:2015-06-25 16:29:48

标签: ruby-on-rails sql-server sql-server-2008 acts-as-taggable-on

我试图在Rails应用程序中对MS SQL Server 2008数据库中的表运行select语句这与Gem act-as-taggable-on有关,如果这有助于任何。

此表没有模型/控制器/ ActiveRecord,因此像Tags.all(或任何常规方法)这样的操作不会做任何事情。

我在Arch Linux上,Ruby 2.1.6 Rails 4.1.11。

我想要"名称"字段已返回,但现在我决定只使用select *语句返回所有字段。

在rails控制台中,这些是我正在运行的命令。

sql = "SELECT * FROM Tags"  
ActiveRecord::Base.connection.execute(sql)

返回:

SELECT * FROM Tags  
=> 191

我所期望的是所有字段的所有191行

(id:integer 4, name:string 255, taggings_count:integer 4)

从MS SQL Server Manager软件中运行类似的select语句将返回预期的输出。

database.yml已正确连接到MS SQL数据库。

就像sql语句试图运行count(*)查询而不是*查询一样。但是,如果我运行count(*)查询,则返回1而不是191。

我和我的同事一样,完全失去了导致这种情况的原因。互联网搜索没有任何用处。

更新:(2015年6月25日下午1点)
出于好奇,我将数据库切换回sqlite,查询工作正常。所以它必须与sql server 2008不兼容,并且在我的应用程序中。

的Gemfile:

source 'https://rubygems.org'

gem 'rails', '4.1.11'
gem 'railties'
gem 'actionpack'
gem 'activesupport'
gem 'will_paginate'
gem 'sqlite3'
gem 'icalendar', '2.3.0'
gem 'formtastic'
gem 'rubycas-client'
gem 'rake', '10.4.2'
gem 'tiny_tds'
gem 'selenium-webdriver', '2.46.2'
gem 'tilt'
gem 'websocket', '1.2.2'
gem 'xpath', '2.0.0'
gem 'rails3-jquery-autocomplete'
gem 'rack'
gem 'auto_complete'
gem 'dynamic_form'
gem 'jquery-timepicker-addon-rails'
gem 'email_spec'
gem 'acts-as-taggable-on'
gem 'rails-dom-testing'
gem 'globalid'
gem 'sprockets-rails'
gem 'rspec-rails'
gem 'person_record', :path => "vendor/gems/person_record-0_0_2", :require => "person_record"
gem 'activerecord-sqlserver-adapter'
gem 'test-unit', '1.2.3'
gem 'arel'


gem 'sass-rails'
gem 'coffee-rails'
gem 'uglifier'

group :development, :test do
  gem 'capybara', '2.4.4'
  gem 'rubyzip', '1.1.7'
  gem 'mocha', '1.1.0', :require => false
  gem 'byebug'
  gem 'spring'
end

group :test do
  gem 'cucumber-rails', :require => false
  gem 'webrat'
  gem 'database_cleaner'
end

# Deploy with Capistrano
gem 'capistrano'
gem 'capistrano-rails', '1.1.3'
gem 'rvm-capistrano', :require => false

3 个答案:

答案 0 :(得分:1)

execute Rails API文档:

  

在此连接的上下文中执行SQL语句   返回连接适配器的原始结果。注意:取决于   您的数据库连接器,此方法返回的结果可能是   手动内存管理。考虑使用#exec_query包装器   代替。

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-execute

基本上,SQLite对原始SQL没有任何兴趣,所以:

ActiveRecord::Base.connection.execute("Select * FROM users")

将输出所有用户(不在结果集中,而是作为数组中的哈希对象)。

而在SQLServer中只会给出计数。由于上面的文档提到了花哨的内存管理。 Rails中的SQLServer适配器可能希望通过执行提供大型结果集的查询来确保人们不会妨碍性能。

请注意Rails适配器在SQLServer中进行的不同结果SQL调用:

irb(main):036:0> ActiveRecord::Base.connection.execute("Select * FROM users")
D, [2017-11-01T11:13:11.942930 #29223] DEBUG -- :    (272.6ms)  Select * FROM users
=> 36613

irb(main):050:0> ActiveRecord::Base.connection.exec_query("Select * FROM users")
D, [2017-11-01T13:10:09.218935 #29223] DEBUG -- :   SQL (1063.8ms)  EXEC sp_executesql N'Select * FROM users'

irb(main):035:0> ActiveRecord::Base.connection.select_all("Select * FROM users")
D, [2017-11-01T11:13:01.574966 #29223] DEBUG -- :    (1211.2ms)  EXEC sp_executesql N'Select * FROM users'

因此,在SQLServer中你不得不使用:

ActiveRecord::Base.connection.exec_query("Select * FROM users")

或者像@kwerle说的那样:

ActiveRecord::Base.connection.select_all("Select * FROM users")

答案 1 :(得分:0)

尝试显式命名select中的所有字段。 另外,请确保存储结果:

result = ActiveRecord::Base.connection.execute(sql)

result.fetch_row.first;

对于调试,也可以尝试:

result.each do |row|
  p row.id
  p row.name
  etc.
end

答案 2 :(得分:0)

ActiveRecord::Base.connection.select_all(sql)