前置き
初心者なのもありMySQLのエラーですごく苦労したのでメモの意味も含めて記事を書かせて頂きます。もしツッコミどころがありましたら、是非ともコメントお願い致します!
以下エラーの内容とその解決方法
チーム開発をしている中、急にrails s
をすると下記のようなエラーが出るようになってしまいました。
ActionView::Template::Error (Mysql2::Error: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'practice_development.test.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by):
42: <div id="navbar" class="navbar-collapse collapse">
43: <ul class="nav navbar-nav">
44: <li>
以下中略
原因としては5.7以上のMySQLを使用しているとsql_modeの初期設定が変わっているためエラーが起こるとのこと。
このエラー文でググったところ見事に分かりやすい記事がヒットしました!!
http://qiita.com/bboobbaa/items/9fdca834076cb4c3389e
上記のサイトを参考にしてまずはターミナル上でmy.cnfファイルがないか確かめます。
mysql --help | grep my.cnf
するとこんな感じでどこにmy.cnfがあるか分かります、、
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
なのでmy.cnfがありそうなところにcd /usrして上記のパスを参考にして探すのですがなんと僕のPCにはmy.cnfファイルが存在しませんでした(泣)
という訳で適当にcd /usr/local/etcまで移動してmy.cnf作成しましょう。こちらは touch my.cnf
で作成できます。そして中身を編集します。
[mysqld]
user = mysql
port = 3306
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
symbolic-links = 0
character-set-server = utf8
skip-character-set-client-handshake
sql_mode = ""
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
こちらはvimコマンドかファイルをエディタから開いて編集してください。
その後mysql.server restartと打ち込み、改めてrails s
すればうまくいくはずなのですが僕の場合違うエラーが出てしまいました。mysql.server restartが全然始まらずrails s
では下記エラーが出てしまいました。。
Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Sequel::DatabaseConnectionError)
筆者は以下のようにsocketのパスを変えた上で、いらなさそうな記述をなくしたところrails sできるようになりました。もちろんファイル更新後mysql.server restartは忘れずにお願いします。
[mysqld]
socket = /tmp/mysql.sock
sql_mode = ""
おそらくsocket = /var/lib/mysql/mysql.sock
というのはwindowsのsocketのパスかなと思いました。Macの場合ですとsocket = /tmp/mysql.sock
がsocketのパスなのでこれで解決できるかと思います。
もし上記の手順でやってみてもエラーになってしまう場合
この場合はおそらくmysqlコマンドもエラーになっているはずです(なのでMySQLサーバーの停止ができない)。
まずはps aux|grep mysql
と打ち込んでみましょう。これによりmysqlのプロセスを確認できます。
おそらくいらない番号のプロセスがあるはずなのでそいつらをkillコマンドで削除する。
例
kill 4795
参考リンク先→ http://qiita.com/yukihigasi/items/a1c84b14ad6807896003
削除後、再度mysql.server restart
で解決。無事にrails s
できるようになるはずです。