5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【EC-CUBE】MySQL8で新しく予約語となった「rank」を「sort_no」に変更した話

Last updated at Posted at 2017-12-16

EC-CUBE Advent Calendar 2017 17日目の記事です。
前回の記事の続きです。

概要

MySQL8で rank が新しく予約語となりました。
EC-CUBEでも rank をソート順のカラム名として利用していたのでMySQL8対応で別のカラム名に置換する必要が出てきました。
この対応でいろいろと周辺の状況についても調べましたのでここにまとめます。

SQLの予約語

プログラミング言語において字句的には識別子としてのルールを満たしているにもかかわらず、識別子にならない字句要素。SQLには予約されたキーワードと予約されていないキーワードがある。(wikipediaより引用)

予約語

SQLの予約語はそのままではカラム名等として使用できません。
MySQL8で新しく予約語が増えたため、MySQL8でEC-CUBEのインストールを使用とするとエラーが発生してしまいました。
EC-CUBEで使用しているカラム名で新しく予約語となったのは rank だけでした。

非予約語(キーワード)

SQLの非予約語(キーワード)はある文脈では特別な意味を持ちますが、カラム名等として使用できます。
EC-CUBEでも非予約語をカラム名として使用していますが、こちらはエラーとならず使用できます。
非予約語は将来予約語となる可能性がありますので、出来れば使用しない方がよいです。

DB EC-CUBEで利用している非予約語例
MySQL name,visible,status,password,value,subject,work,code,source,event,handler
PostgreSQL id,name,event,rank,version,source,handler,password,work,header,value,hierarchy

この機会にいろいろなSQLの予約語を調べましたので予約語の一覧を作成しました。
こちらの記事で投稿しておりますので予約語を調べられる際はご活用ください。

EC-CUBEにおける rank

EC-CUBEでは項目の表示順を保存するカラム名として rank を使用しておりました。
カテゴリーや商品規格、配送方法、支払方法等の12個のデータテーブルだけでなく、22個のすべてのマスタデータテーブルで rank を利用していましたので対応が必要な範囲はかなり広いものとなりました。

対応方針

EC-CUBE3.nではORMとしてDoctrineを使用しております。
MySQLではバッククオートで囲むことで予約語でも使用可能となるのですが、Doctrineがこちらの手法に対応しておりません。
ですので今回は ranksort_no へ変更することで対応することにしました。

対応方法

実際にやった作業内容はIDEの検索/置換機能と目grepを組み合わせた泥臭い作業でした。
EC-CUBE3.nではフレームワークを利用して開発が進められており、命名規則もフレームワークに沿っておりますのである程度グループ分けをして置換していくことができました。

  • コメントの rank -> sort_no
  • 文字列リテラルの rank -> sort_no
  • プログラム内の Rank -> SortNo
  • プログラム内の rank -> sortNo

実際の対応内容はこちらのプルリクですのでご確認いただければと思います。
上記のプルリクでは rank 以外のカラム名の変更も同時に行っています。

カラム名変更でチェックが必要な個所

Entity

  • アノテーションでカラム名の定義が書かれているので修正
    • 例: @ORM\Column(name="sort_no", type="smallint", options={"unsigned":true})
  • クラス変数を修正
    • 例: private $sort_no;
    • キャメルケースではなくスネークケースなので注意
  • getter / setter の修正
    • 例: getSortNo / setSortNo
    • ドキュメンテーションコメントや引数も合わせて修正しましょう。
    • 呼び出している側も修正が必要です。
      • IDEのリファクタリングを活用出来ればよかったんですが、今回は対象テーブルが多かったので getRank / setRank で横断検索して置換をしました。

Repository

  • createQueryBuilderの修正
    • 例: $qb = $this->createQueryBuilder('cn')->orderBy('cn.sort_no', 'DESC');
    • 文字列リテラルで指定されています。スネークケースで置換しましょう。
  • 変数の修正
    • 例: $sortNo

import_csv

EC-CUBEのインストール時にインポートされるデータです。
src/Eccube/Resource/doctrine/import_csv/のディレクトリにあります。

  • 1行目がカラム名になっているので修正
  • src/Eccube/Resource/doctrine/import_csv/dtb_csv.csvfield_name のカラムの修正
    • CSVで吐き出されるカラムの場合は確認が必要

Controller / Service / FormType / Twig

  • こちらでも識別子として使用されている個所が多々ありました。
    • 大文字/小文字/コメント/コード/文字列リテラルを区別して検索/置換していきました。

EC-CUBEのインストーラーまわり

初期データ作成処理で修正が必要な個所がありました。
インストールは画面からのインストールとコマンドでのインストールで処理が別々になっていますのでどちらもチェックが必要です。

  • eccube_install.php
  • src/Eccube/Controller/Install/InstallController.php

Test

  • 検索/置換とテストを走らせてみてこけたところの修正が必要です。

上記に上げた修正だけで網羅できるということではないのでその他の個所も検索等を使って確認をお願いします。

最後に

EC-CUBEのカラム名変更をする機会は少ないかと思いますが、カラム名を変更されえる方がおられましたら参考にしていただけると嬉しいです。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?