我在两个表(用户名:字符串组:整数)和关系(源:整数,目标:整数,值:整数)之间存在一对多的关系。它们是相关的,因此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
这些表都是应该填充的。我无法弄清楚确切的语法错误是什么。
答案 0 :(得分:2)
Group By
是保留关键字,您不应将其用作列名。
基本的误解是人们会将Group
统称为保留的。 By
和group
是两个不同的保留关键字。
将列名 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`,
文档: