rails数据库查询中的语法错误

时间:2015-06-09 08:28:16

标签: mysql sql ruby-on-rails sqlite

我在两个表(用户名:字符串组:整数)和关系(源:整数,目标:整数,值:整数)之间存在一对多的关系。它们是相关的,因此userid = relatioship.source。

我试图从中获取一些json所以我写了:

 def self.including_relationships
    User.joins("INNER JOIN relationships ON users.id = relationships.source").select("users.name, users.group, relationships.source, relationships.target, relationships.value").each_with_object(Hash.new{|h, k| h[k] = []}) do |a, obj| 

      obj['nodes'] << a.slice('name','group')
      obj['links'] << a.slice('source', 'target', 'value')

但是我收到了错误

SQLite3::SQLException: near "group": syntax error: SELECT users.name, users.group, relationships.source, relationships.target, relationships.value FROM "users" INNER JOIN relationships ON users.id = relationships.source

当我在切片中删除users.group和'group'时,它可以正常工作。

我检查了我的数据库架构,如下所示:

ActiveRecord::Schema.define(version: 20150603200530) do

  create_table "relationships", force: true do |t|
    t.integer "source"
    t.integer "target"
    t.integer "value"
  end

  create_table "users", force: true do |t|
    t.string  "name"
    t.integer "group"
  end

end

这些表都是应该填充的。我无法弄清楚确切的语法错误是什么。

2 个答案:

答案 0 :(得分:2)

Group By是保留关键字,您不应将其用作列名。

基本的误解是人们会将Group统称为保留的。 Bygroup是两个不同的保留关键字。

将列名 public String ToJSONRepresentation(List<MassPay> lMassPay) { StringBuilder sb = new StringBuilder(); JsonWriter jw = new JsonTextWriter(new StringWriter(sb)); jw.Formatting = Formatting.Indented; jw.WriteStartObject(); jw.WritePropertyName("oauth_consumer_key"); jw.WriteValue("asdasdsadasdas"); jw.WritePropertyName("mass_pays"); jw.WriteStartArray(); int i; i = 0; for (i = 0; i < lMassPay.Count; i++) { jw.WriteStartObject(); jw.WritePropertyName("legal_name"); jw.WriteValue(lMassPay[i].legal_name); jw.WritePropertyName("account_number"); jw.WriteValue(lMassPay[i].account_number); jw.WritePropertyName("routing_number"); jw.WriteValue(lMassPay[i].routing_number); jw.WritePropertyName("amount"); jw.WriteValue(lMassPay[i].amount); jw.WritePropertyName("trans_type"); jw.WriteValue(lMassPay[i].trans_type); jw.WritePropertyName("account_class"); jw.WriteValue(lMassPay[i].account_class); jw.WritePropertyName("account_type"); jw.WriteValue(lMassPay[i].account_type); jw.WritePropertyName("status_url"); jw.WriteValue(lMassPay[i].status_url); jw.WritePropertyName("supp_id"); jw.WriteValue(lMassPay[i].supp_id); jw.WriteEndObject(); } jw.WriteEndArray(); jw.WriteEndObject(); return sb.ToString(); } 更改为其他名称。它会工作。 或者如果您想使用保留关键字based on the documentation

  

如果要使用关键字作为名称,则需要引用它。那里   有四种在SQLite中引用关键字的方法:

     

&#39;关键字&#39; 单引号中的关键字是字符串文字。
  &#34;关键字&#34; 双引号中的关键字是标识符。
[keyword] A.   括在方括号中的关键字是一个标识符。这不是   标准SQL。 MS Access和SQL使用此引用机制   服务器并包含在SQLite中以实现兼容性。
`keyword` A.   用严重重音符号(ASCII代码96)括起来的关键字是一个标识符。   这不是标准的SQL。这种引用机制由MySQL和   SQLite中包含了兼容性。


请参阅list of reserved keywords for sqlite以获取更多信息。

答案 1 :(得分:2)

group是保留字。

要将它用作数据库对象,请在其周围使用后退。

您的部分陈述应修改如下:

select("users.name, users.`group`, 

文档