Использование 'end' в качестве имени столбца в Ruby on Rails (MySQL) - PullRequest
2 голосов
/ 06 апреля 2011

У меня была модель с «конечным» столбцом (формат даты и времени) только для того, чтобы обнаружить, что Heroku вылетает и горит из-за нелогичных ошибок Active Record, когда я пытался сослаться на столбец в запросе. Я потратил два часа на отладку чрезвычайно простого запроса, после чего переименовал столбец в «end_at», и все мои проблемы исчезли.

Кто-нибудь еще сталкивался с этой проблемой? Мне любопытно обоснование этого и надеюсь, что мы можем помочь другим избежать той же ошибки. Подобный вопрос задавался до , но четкого ответа не было.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

BEGIN и END являются зарезервированными словами в Oracle и SQL Server, но не уверены, почему MySQL не считает их таковыми .

Однако PGError может указывать на то, что само ядро ​​базы данных (а не любая среда выполнения, связанная с Ruby) действительно отклонило запрос из-за «конца».

Зарезервированные слова (и имена, содержащие пробелы) могут использоваться в кавычках - возможно, Active Record не заключил в кавычки идентификаторы в сгенерированном SQL.

Я бы посмотрел журнал в MySQL (http://dev.mysql.com/doc/refman/5.5/en/query-log.html) и увидел сгенерированные операторы.

И поскольку PGError означает PostGreSQL, а вы упомянули Heroku (PostgreSQL 8.3) - я думаю, это потому, что END действительно зарезервированное слово в PostgreSQL: http://www.postgresql.org/docs/8.3/static/sql-keywords-appendix.html

http://www.petefreitag.com/tools/sql_reserved_words_checker/?word=end

1 голос
/ 06 апреля 2011

PostgresQL (который использует Heroku) резервирует END в качестве ключевого слова , поэтому он выдает синтаксическую ошибку из-за неправильного синтаксиса.

Существует два варианта исправления:

Если Heroku ломается из-за того, что ActiveRecord не заключает в кавычки имена столбцов, вы можете переписать каждый запрос, который использует эту модель, чтобы явно заключить в кавычки столбец «конец», чтобы PostgresQL не взорвался.

не ActiveRecord цитирует это имя столбца по умолчанию, переименовывая столбец как-то более наглядно (end_time, end_date и т. д.), а также не зарезервированное слово как на языке, на котором вы пишете приложение, так и зарезервированное слово в движке SQL, которым вы являетесьиспользование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...