- 投稿日:2019-05-27T16:57:40+09:00
[MYSQL]サブクエリを使いレコードを更新する
モチベーション
テストデータを作るのに
created_at
にCURRENT_TIMESTAMP
を使用したので、バラツキのある日付にしたかった。
バラツキは100日前を制限とし更新したい。sample.sqlUPDATE users, ( SELECT id, DATE_SUB(created_at, INTERVAL (ROUND(RAND() * 99 + 1)) DAY) as sub_users_created_at from users ) AS date_sub_users SET users.created_at = date_sub_users.sub_created_at WHERE users.id = date_sub_users.id;備忘録です。
- 投稿日:2019-05-27T13:33:34+09:00
MySQL 8.0.16でユーザーを追加できない
はじめに
Mac上で、MySQLのバージョンを8.0.12から8.0.16にアップデートしたら、ユーザーを追加できなくなってしまいました。対処方法について、既に多くの方が書き残されていたのですが、軽く見た感じ、Mac版の解決方法そのものを残している方が見当たらなかったので、書き残しておきます。
環境
バージョン OS macOS 10.14.4 MySQL 8.0.16 現象
こんな感じでユーザーを追加しようとすると、エラーが表示される
$ echo "CREATE USER 'db_user'@'%' IDENTIFIED BY 'db_userXXX';" | mysql -uroot ERROR 3009 (HY000) at line 1: Column count of mysql.user is wrong. Expected 51, found 49. Created with MySQL 80012, now running 80015. Please use mysql_upgrade to fix this error.mysql_upgradeを使えと仰るので、使ってみると今度はdeprecatedとのこと
$ mysql_upgrade -uroot The mysql_upgrade client is now deprecated. The actions executed by the upgrade client are now done by the server. To upgrade, please start the new MySQL binary with the older data directory. Repairing user tables is done automatically. Restart is not required after upgrade. The upgrade process automatically starts on running a new MySQL binary with an older data directory. To avoid accidental upgrades, please use the --upgrade=NONE option with the MySQL binary. The option --upgrade=FORCE is also provided to run the server upgrade sequence on demand. It may be possible that the server upgrade fails due to a number of reasons. In that case, the upgrade sequence will run again during the next MySQL server start. If the server upgrade fails repeatedly, the server can be started with the --upgrade=MINIMAL option to start the server without executing the upgrade sequence, thus allowing users to manually rectify the problem.上記メッセージで「MySQL binaryに、オプション"--upgrade=XXXXX"をつけろ」と仰るので、付けてみても上手くいかない
$ mysql -uroot --upgrade=NONE mysql: [ERROR] unknown variable 'upgrade=NONE'.結論
Mac上でのMySQL binaryは
mysql.server
のことなので、以下のように使う$ mysql.server start --upgrade=FORCE Starting MySQL . SUCCESS!感想
MySQL 8.0.16から、mysql_upgradeはdeprecatedとのことなので、エラーメッセージで「Please use mysql_upgrade to fix this error.」と書くのは誤解を招くなぁ、と思いました。まだエラーメッセージまで手が回っていないだけで、そのうち修正されると思いますが。
参考
- MySQL 8.0.16: mysql_upgrade is going away
- mysql_upgradeの仕様変更について解説があります
- 投稿日:2019-05-27T13:33:34+09:00
MySQL 8で、mysql_upgradeがdeprecatedになった
はじめに
Mac上で、MySQLのバージョンを8.0.12から8.0.16にアップデートしたら、ユーザーを追加できなくなってしまいました。従来はmysql_upgradeを使って対処できましたが、8.0.16ではdeprecatedになった為、代わりの方法を書き残しておきます。
環境
バージョン OS macOS 10.14.4 MySQL 8.0.16 現象
こんな感じでユーザーを追加しようとすると、エラーが表示される
$ echo "CREATE USER 'db_user'@'%' IDENTIFIED BY 'db_userXXX';" | mysql -uroot ERROR 3009 (HY000) at line 1: Column count of mysql.user is wrong. Expected 51, found 49. Created with MySQL 80012, now running 80015. Please use mysql_upgrade to fix this error.mysql_upgradeを使えと仰るので、使ってみると今度はdeprecatedとのこと
$ mysql_upgrade -uroot The mysql_upgrade client is now deprecated. The actions executed by the upgrade client are now done by the server. To upgrade, please start the new MySQL binary with the older data directory. Repairing user tables is done automatically. Restart is not required after upgrade. The upgrade process automatically starts on running a new MySQL binary with an older data directory. To avoid accidental upgrades, please use the --upgrade=NONE option with the MySQL binary. The option --upgrade=FORCE is also provided to run the server upgrade sequence on demand. It may be possible that the server upgrade fails due to a number of reasons. In that case, the upgrade sequence will run again during the next MySQL server start. If the server upgrade fails repeatedly, the server can be started with the --upgrade=MINIMAL option to start the server without executing the upgrade sequence, thus allowing users to manually rectify the problem.上記メッセージで「MySQL binaryに、オプション"--upgrade=XXXXX"をつけろ」と仰るので、付けてみても上手くいかない
$ mysql -uroot --upgrade=NONE mysql: [ERROR] unknown variable 'upgrade=NONE'.結論
Mac上でのMySQL binaryは
mysql.server
のことなので、以下のように使う$ mysql.server start --upgrade=FORCE Starting MySQL . SUCCESS!感想
MySQL 8.0.16から、mysql_upgradeはdeprecatedとのことなので、エラーメッセージで「Please use mysql_upgrade to fix this error.」と書くのは誤解を招くなぁ、と思いました。まだエラーメッセージまで手が回っていないだけで、そのうち修正されると思いますが。
参考
- MySQL 8.0.16: mysql_upgrade is going away
- mysql_upgradeの仕様変更について解説があります
- 投稿日:2019-05-27T11:37:25+09:00
Pythonで株価スクレイピング
目的
株価解析のために、全銘柄に対して過去約20年分のデータを取得し、
データベースに蓄積する。コード
https://github.com/jun6231jp/stoks/blob/master/scraping_stoks.py
Yahooファイナンスからスクレイピングする。
サーバ過負荷にならないよう、アクセス間隔をある程度空けている。
仮にサーバエラーとなった場合はリトライするようにしている。データベース作成
株式コードに対する社名および株価を蓄積するためのデータベースを次のように作成する。
stoksnames +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(100) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ prices +--------+---------+------+-----+------------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+---------+------+-----+------------+-------+ | id | int(11) | NO | PRI | 0 | | | date | date | NO | PRI | 0000-00-00 | | | open | int(11) | YES | | NULL | | | high | int(11) | YES | | NULL | | | low | int(11) | YES | | NULL | | | close | int(11) | YES | | NULL | | | volume | int(11) | YES | | NULL | | | fixed | int(11) | YES | | NULL | | +--------+---------+------+-----+------------+-------+実行結果
社名および各社の株価の日次データを取得できた。
names +------+-------------------------------------------------------- | id | name +------+-------------------------------------------------------- | 1301 | (株)極洋 | 1305 | ダイワ 上場投信-トピックス | 1306 | TOPIX連動型上場投資信託 | 1308 | 上場インデックスファンドTOPIX | 1309 | 上海株式指数・上証50連動型上場投資信託 . . . prices +------+------------+------+------+------+-------+--------+-------+ | id | date | open | high | low | close | volume | fixed | +------+------------+------+------+------+-------+--------+-------+ | 1301 | 2019-05-07 | 2742 | 2786 | 2742 | 2783 | 22200 | 2783 | | 1301 | 2019-05-08 | 2777 | 2780 | 2745 | 2774 | 23200 | 2774 | | 1301 | 2019-05-09 | 2762 | 2772 | 2716 | 2722 | 25800 | 2722 | | 1301 | 2019-05-10 | 2725 | 2740 | 2690 | 2690 | 42900 | 2690 | | 1301 | 2019-05-13 | 2690 | 2826 | 2656 | 2786 | 75600 | 2786 | | 1301 | 2019-05-14 | 2712 | 2818 | 2686 | 2810 | 50800 | 2810 | | 1301 | 2019-05-15 | 2806 | 2824 | 2766 | 2824 | 35500 | 2824 | | 1301 | 2019-05-16 | 2824 | 2888 | 2811 | 2851 | 55600 | 2851 | | 1301 | 2019-05-17 | 2852 | 2887 | 2833 | 2884 | 37300 | 2884 | | 1301 | 2019-05-20 | 2894 | 2908 | 2850 | 2853 | 16000 | 2853 | | 1301 | 2019-05-21 | 2849 | 2856 | 2808 | 2821 | 26900 | 2821 | . . .
- 投稿日:2019-05-27T02:26:03+09:00
「MySQL 8.0 の薄い本」を作って配っている話
タイトルの通り、「MySQL 8.0 の薄い本」(薄くない)を以下のリポジトリで配布しています。
出掛けた先のイベント・勉強会などでも物理本を配布しています。
これについてははてなブログにも書きましたが、そこで触れなかった点についてあらためて記しておきます。
また、物理本を作るのに必要なデータもリポジトリに置いてありますので、印刷方法についても軽く説明しておきます。
内容
MySQL 8.0 の新機能と以前のバージョン(5.7 およびそれ以前)からの変更点について、
- 利用例(サンプル)
- それを扱ったブログ記事等へのリンク
を集めたものです。
- インストールと設定パラメータ
- ユーザ管理・認証・権限設定
- DDL と管理⽤ SQL
- CTE とウィンドウ関数
- JSON とオブジェクトストア
- GIS(地理情報システム)
- レプリケーション
- オプティマイザとInnoDB
- Information Schema・Performance Schema
- その他
利用例(サンプル)は自分が Qiita に掲載した記事のものに手を入れるか、別のデータを利用して作成しました。
ページ数の関係で、機能解説については最小限にとどめています(リンク先をご参照ください)。
MySQL 8.0 をテーマにした理由
先に示したはてなブログの記事にいくつか書いたのですが、そこに書かなかったことのうち大きな理由としてあげられるのは、
- MySQL 8.0 の書籍が商業出版・技術同人誌ともほとんど見当たらないこと(せいぜい雑誌記事程度)
- MySQL 8.0 が Continuous Delivery Model(継続提供モデル)を採用していること
です。
前者については、商業出版で何冊か企画・執筆中という噂は聞きますが、それなりに時間が掛かりそうな雰囲気です。
後者については、言い換えれば「GA 以降もどんどん新機能を追加し改良を加えていくことを提供元(Oracle)自身が宣言した」ということですが、仮に商業出版で MySQL 8.0 についての書籍を出した場合、同じバージョンでも MySQL 自体がどんどん「進化」してしまい書籍の内容がすぐ古くなり置き去りにされていくことになります。
流行りのクラウドサービスや言語・開発環境、ミドルウェアを扱った書籍によく見られる現象ですね。
MySQL 8.0 についていうと、例えば GIS 機能は MySQL 5.7 までと比較してかなり使いやすくはなったものの PostGIS などと比較するとまだまだ不足している部分があり、今後の機能拡張が予想されます。
また、関数など SQL だけでなく、例えば非同期通信やクラスタ構成のコンテナ対応など、RDBMS を利用する環境の変化への対応のようなものも必要になってきます。
こういったものについては、商業出版よりも技術同人誌で、テーマを絞って短いサイクルで扱っていくほうが向いていると思います。
無償提供とした理由
こちらも先に示したはてなブログの記事にいくつか書いたのですが、そこに書かなかった大事なポイントとして、
- 誰かが MySQL 8.0 の特定の機能や関連サービスについて書いてくれるきっかけにしたかった
というものがあります。
ある意味「ネタ探し帳」と言えるかもしれません。
というわけで…誰か MySQL 8.0 の何かをテーマに技術同人誌を書いて頒布してください!
(↑この記事で一番伝えたかったのはこれです!)
参考情報:印刷データの使い方
先に記した GitHub リポジトリには印刷用のデータも含まれています(PDF_print ディレクトリ内)。
これ(ら)の使い方について簡単に説明します。
簡易製本する場合
「卓上製本機とじ太くん」を使って簡易製本する場合は、
- B5 で厚さ 0.1mm 前後の用紙
- B5 タテ・背幅 6mm の製本カバー
を用意し、
- トンボなしの本文データ(book_no_tombo_x1a.pdf)
をプリンタで両面印刷し、卓上製本機で製本します。
そうすると、写真右上のような冊子ができあがります。
オンデマンド印刷に出す場合
発注先の印刷屋さんに合わせて、
- トンボありの本文データ(book_x1a.pdf)
- トンボなしの本文データ(book_no_tombo_x1a.pdf)
のどちらかを入稿します。
また、必要に応じて、
- 表紙データ(mysql80_thin_book_cover_cmyk.psd:表 4・表 1 に相当)
- 表紙の裏側のデータ(mysql80_thin_book_cover_hyo23_cmyk.psd:表 2・表 3 に相当)
も入稿します。
なお、データは Re:VIEW から出力されたままの状態ではなく、RGB → CMYK 変換など印刷用に加工してからリポジトリに上げてあります。
ここでは、例としてラクスル(冊子印刷)に表紙データ付きで発注する場合をあげます。
ラクスルの冊子印刷では、1 部のみの発注の場合に割引があります。また、会員登録時などクーポンが発行され、1 部のみの発注が 1 回に限って無料になる場合もあります。
「冊子・カタログ印刷」→「小部数無線綴じ冊子」を選びます。
サイズ・ページ数(表紙の 4 ページと本文のページ数の合計)、用紙等を選択します。本文はモノクロ印刷にします(変更忘れに注意!)。
終わったら「1 部・3 営業日後」を選んでまず注文を完了させます。
その後、原稿を入稿しますが、原稿チェックしやすいように、表紙データ・本文データともファイル名をページ番号に変更し、補足説明を書いてアップロード・入稿します。
入稿を済ませ、発注先での原稿チェックが終わると、印刷原稿の PDF データがダウンロードできるようになります。
表紙(表 4:裏表紙・表 1:オモテ表紙)見開き→表紙の裏側(表 2・表 3)見開き→本文 1 ページ目(単独)→本文 2 ページ目以降(見開き)→本文最終ページ(単独)
の順になっていれば OK です。違っていたら連絡を入れて修正してもらいます。
1 部のみの発注の場合、印刷された冊子はメール便で届きます。