2015-06-09 4 views
0

У меня есть отношение «один-много» между двумя таблицами (имя пользователя: string group: integer) и Relationship (source: integer, target: integer, value: integer). Они связаны так, что userid = relatioship.source.Ошибка синтаксиса в запросе базы данных rails

Я пытаюсь получить некоторые 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 и «группы» в срез, он отлично работает.

Я проверил мою схему базы данных, которая выглядит следующим образом:

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

Почему тег MySQL? – jarlh

ответ

2

Group - зарезервированное ключевое слово, и вы не должны использовать его в качестве имени столбца.

Основное заблуждение - люди будут думать Group By коллективно как зарезервированный. Group и By - это два разных зарезервированных ключевых слова.

Изменить название колонки group на что-то еще. Это будет работать. Или Если вы хотите использовать зарезервированное ключевое слово, based on the documentation

Если вы хотите использовать ключевое слово в качестве имени, вам нужно процитировать. Там - четыре способа цитирования ключевых слов в SQLite:

«keyword» Ключевое слово в одинарных кавычках - строковый литерал.
«keyword» Ключевое слово в двойных кавычках - это идентификатор.
[ключевое слово] A Ключевое слово, заключенное в квадратные скобки, является идентификатором. Это не стандартный SQL. Этот механизм цитирования используется сервером MS Access и SQL и входит в состав SQLite для обеспечения совместимости.
`keyword` A Ключевое слово, заключенное в глубоких акцентах (код ASCII 96), является идентификатором. Это не стандартный SQL. Этот механизм цитирования используется MySQL, а включен в SQLite для обеспечения совместимости.


Для получения дополнительной информации, пожалуйста, обратитесь к list of reserved keywords for sqlite.

2

group - зарезервированное слово.

Чтобы использовать его в качестве объекта базы данных, используйте обратные тики вокруг него.

Часть ваших заявлений должна быть изменена, как показано ниже:

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

Документация:

  • Keywords and Reserved Words
    • Большинство зарезервированных слов в таблице запрещены стандартным SQL как имена столбцов или таблиц (например, GROUP)
Смежные вопросы