sql - 使用Rails Console SQL查询字符串学习SQL

标签 sql ruby-on-rails ruby activerecord sqlite

使用ActiveRecord内部的ORM rails console,我可以轻松而合理地获得:第一件商品的款式零售价:

[25] pry(main)> Item.first.style.retail_price
  Item Load (0.2ms)  SELECT  "items".* FROM "items"  ORDER BY "items"."id" ASC LIMIT 1
  Style Load (0.1ms)  SELECT  "styles".* FROM "styles" WHERE "styles"."id" = ? LIMIT 1  [["id", 1]]
=> #<BigDecimal:7fe7a6bc7678,'0.6E2',9(27)>


我读到another post,可以使用ActiveRecord::Base.connection.execute运行原始sql命令。我应该得到类似“ 60.0”的东西,因为Item.first.style.retail_price.to_s #=> "60.0"相反,我得到了某种带有哈希值的数组:

[26] pry(main)> ActiveRecord::Base.connection.execute('SELECT  "items".* FROM "items"  ORDER BY "items"."id" ASC LIMIT 1; SELECT  "styles".* FROM "styles" WHERE "styles"."id" = ? LIMIT 1  [["id", 1]]')

   (0.2ms)  SELECT  "items".* FROM "items"  ORDER BY "items"."id" ASC LIMIT 1; SELECT  "styles".* FROM "styles" WHERE "styles"."id" = ? LIMIT 1  [["id", 1]]
=> [{"id"=>1, "size"=>"M", "color"=>"Purple", "status"=>"sellable", "price_sold"=>nil, "sold_at"=>nil, "style_id"=>1, "created_at"=>"2017-02-04 04:47:09.415828", "updated_at"=>"2017-02-04 04:47:09.415828", "clearance_batch_id"=>nil, 0=>1, 1=>"M", 2=>"Purple", 3=>"sellable", 4=>nil, 5=>nil, 6=>1, 7=>"2017-02-04 04:47:09.415828", 8=>"2017-02-04 04:47:09.415828", 9=>nil}]


另外,当我尝试相同的查询字符串是rails db时,我还会收到语法错误:

rails db
SQLite version 3.14.0 2016-07-26 15:17:14
Enter ".help" for usage hints.
sqlite> SELECT  "items".* FROM "items"  ORDER BY "items"."id" ASC LIMIT 1; SELECT  "styles".* FROM "styles" WHERE "styles"."id" = ? LIMIT 1  [["id", 1]];
1|M|Purple|sellable|||1|2017-02-04 04:47:09.415828|2017-02-04 04:47:09.415828|
Error: near "[["id", 1]": syntax error
sqlite>


3个问题:


ActiveRecord::Base.connection.execute需要什么字符串才能返回看起来像60.0的预期结果?
rails db需要什么字符串?
如何将rails console给我的sql字符串转换为可与ActiveRecord::Base.connection.executerails db一起使用的原始sql查询字符串的一般模式是什么?

最佳答案

如果只想从一个区域中选择一个字段,则必须在SQL的select子句中指定它。像这样

SELECT styles.retail_price FROM styles WHERE styles.id = 1


在这种情况下,如果使用rails的retail_price方法,则只能获取execute数组中的内容。如果只需要单个值,请使用select_value方法,而不要使用execute。喜欢

ActiveRecord::Base.connection.select_value("SELECT styles.retail_price FROM styles WHERE styles.id = 1")


由于此[["id", 1]],在sqlite3终端中您将获得语法错误。这是用于准备好的语句的rails / applicative-level东西,但不是有效的SQL。您应该像我一样替换ID。

关于sql - 使用Rails Console SQL查询字符串学习SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42058773/

相关文章:

c# - In Code first The INSERT 语句与 FOREIGN KEY 约束冲突

ruby-on-rails - 改革 gem : use one model for multiple forms

ruby-on-rails - Rails 在创建应用程序时不遵守指定的版本

sql - 显示包含特定列的所有表

sql - 帮助优化 SQL While 循环

ruby-on-rails - 基于小时的 ActiveRecord 范围

ruby - 使用 rspec 的 Selenium 屏幕截图

ruby-on-rails - 在 Ruby/Rails 中压缩十六进制字符串

sql - MySQL:将一个表拆分为多个表(相同列)以提高性能?

ruby-on-rails - ruby 网 :HTTP SSL bug or is it me?