MySQL



2013年 9月 25

※何故か記載が全体的にORDER BY句になっていたので修正…

DBIx::SkinnyでGROUP BY句を使う

DBIx::SkinnyでGROUP BY句は使えないっぽい。マニュアルにも無い。Tengでは使えるみたいだけれど。resultsetでSQL組み立てれば出来るのかと思ったのだけれどどうも無理っぽい。

で、ググっていたらテストにそれらしい記述があるのを発見。ただし、DBIx::Skinny::Pager のテスト。
https://github.com/walf443/p5-dbix-skinny-pager/blob/master/t/02-functional.t

$rs->group({ column => ‘カラム名’ });

どうやら groupというメソッドがあるようだ。やっぱりマニュアルに載ってないけど。

作っているwebアプリはページング処理をするために丁度 DBIx::Skinny::Pager を使ってたのでこの方法で。

コード

  my $rs = $self->resultset_with_pager('MySQLFoundRows');
  $rs->select([qw/
        entry_id
        entry_title
      /]);
  $rs->from(['entry']);
  $rs->group({ column => 'category' });
  $rs->add_where( entry_status => 'public' );

構築されるSQL

SELECT SQL_CALC_FOUND_ROWS entry_id, entry_title
FROM entry
WHERE (entry_status = ?)
GROUP BY category

生SQL使えばいい問題なんだけどね 😛


Filed under: MySQL,perl,perlモジュール

Trackback Uri






2013年 5月 28

MySQL – SELECT … WHERE id IN (..) – correct order – Stack Overflow

という事で、MySQLでこんなSQLが使えるとの事。

SELECT * FROM table WHERE id IN (4,3,1) ORDER BY FIELD(id,4,3,1)

なので、PerlのORMであるDBIx::SkinnyでSQL組み立てられるのか実験してみる。

my @id_lists = (4,3,1);
$" = ",";  #"

my $rs = MyModel->resultset;
$rs->select([qw/*/]);
$rs->from(['entry']);
$rs->add_where('id' => { 'IN' => \@id_lists });
$rs->order({ 'column' => "FIELD(id, @id_lists)" });

warn $rs->as_sql;

----- 実行結果
SELECT *
FROM entry
WHERE (id IN (?,?,?))
ORDER BY FIELD(id, 4,3,1)

特殊変数 $” で 配列展開時の区切り文字を ,(カンマ) にしている。DBIx::Skinnyなんだから生のSQL使えばいい話だけど。かなり無理矢理だけど一応使えると言う事で。

参考

Filed under: MySQL,perlモジュール

Trackback Uri






2013年 3月 26

  • OSX Mountain Lion 10.8.3
  • groonga 3.0.1
  • MySQL 5.5.30
  • MAMP 2.1.4

groongaのインストール

groongaはMacportsでインストールする。

sudo port install groonga

groongaをインストールするとmysql55もインストールされるのでソースコードはこれを使う。…と、思ったら最近のmacportsはバイナリをダウンロードするらしい(Shibu’s Diary: MacPortsは生まれ変わった

MacPortsのバイナリダウンロードはビルドした時と違うファイルになる場合があるっぽい – kanonjiの日記 ココを読むとソースコードからインストール出来るオプションが有るみたい。

#一度アンインストールして...
$ sudo port uninstall mysql55 @5.5.30_1

# -s オプションを付けてソースからインストール
$ sudo port install -s mysql55

ソースのpathはこんな感じ
/opt/local/var/macports/distfiles/mysql55/mysql-5.5.30.tar.gz
なので、これをコピーして解凍する。

#無い場合はsrc ディレクトリを作って
$ mkdir ~/src
$ cd ~/src
#
$ sudo mv /opt/local/var/macports/distfiles/mysql55/mysql-5.5.30.tar.gz ~/src/mysql-5.5.30.tar.gz 
Password:
$ tar zxvf mysql-5.5.30.tar.gz

mroongaのインストール

packages.groonga.org から最新版のmroongaをダウンロードします。このエントリーを書いている時点の最新版は mroonga-3.01.tar.gz です。

ダウンロードして解凍します。

$ wget http://packages.groonga.org/source/mroonga/mroonga-3.01.tar.gz

tar zxvf mroonga-3.01.tar.gz

2. インストールガイド — mroonga v3.01 documentation を読むと、

groongaを/usr/libなど標準のパス以外にインストールした場合はPKG_CONFIG_PATHを指定する必要があります。例えば、ーーprefix=$HOME/localでgroongaをインストールした場合は以下のようにします。

とあります。

pkg-configのpathは

$ which pkg-config
/opt/local/bin/pkg-config

mysql_config のpathは

$ which mysql_config
/usr/local/bin/mysql_config

MySQLのソースのpathは先程解凍したものとなりますので、configureは以下のようになります。

$ cd mroonga-3.00
$ ./configure \
  PKG_CONFIG_PATH=/opt/local/bin/pkg-config \
  --with-mysql-source=$HOME/src/mysql-5.5.30 \
  --with-mysql-config=/usr/local/bin/mysql_config

その後 makeを実行します。

$ make
$ sudo make install

/opt/local/lib/mysql55/plugin/ 以下にmroongaがインストールされます。

後は公式ガイド通り

mysql> INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';

mysql> CREATE FUNCTION last_insert_grn_id RETURNS INTEGER soname 'ha_mroonga.so';

を実行します。

ちなみにいつの間にかMAMPのMySQLがバージョン5.5になっていたので、別途MySQLをインストールしなくてもmroongaが使えるのではないかと思い試してみたけど、make出来ないので諦めた。


Filed under: Mac,MySQL,インストールメモ

Trackback Uri






2012年 5月 30

MAMP

ApacheもMySQLも常時起動しておくのは微妙だし、でも使う時にはサクッと使いたい。そんな時にMAMPがあればローカルのApacheとMySQLを自動で起動してくれるから便利。phpMyAdminもついてるしね。
インストールメモはこっち

で、MAMPデフォルトのMySQLではなく、先日インストールしたmroonga対応のMySQLをMANPで使えるようにする。

MySQLのrootユーザーのパスワードを設定

MAMPのMySQLはデフォルトで ユーザーroot パスワードrootで設定されているので同じように設定する(方が簡単?)ローカルのMySQLだからroot:rootでもおkでしょう。

MacBook:~ clicktx$ sudo /opt/local/share/mysql55/support-files/mysql.server start
Password:
Starting MySQL
.. SUCCESS! 
MacBook:~ clicktx$ /opt/local/lib/mysql55/bin/mysql -uroot
mysql> SET PASSWORD FOR root@localhost=PASSWORD('root');
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye

で、MySQLサーバを停止。

MacBook:~ clicktx$ sudo /opt/local/share/mysql55/support-files/mysql.server stop
Shutting down MySQL
. SUCCESS! 

MAMPの起動スクリプトを編集

/Applications/MAMP/bin/ の中にあるMySQL起動スクリプトや停止スクリプト等を編集する。編集するファイルは

  • checkMysql.sh
  • repairMysql.sh
  • startMysql.sh
  • stop.sh

の4つ。オリジナルはコピーしておきましょう。中身はこんな感じ。

checkMysql.sh

# /bin/sh
#/Applications/MAMP/Library/bin/mysqlcheck --all-databases --check --check-upgrade -u root -proot --socket=/Applications/MAMP/tmp/mysql/mysql.sock
/opt/local/lib/mysql55/bin/mysqlcheck --all-databases --check --check-upgrade -u root -proot --socket=/Applications/MAMP/tmp/mysql/mysql.sock

repairMysql.sh

# /bin/sh
#/Applications/MAMP/Library/bin/mysqlcheck --all-databases --repair -u root -proot --socket=/Applications/MAMP/tmp/mysql/mysql.sock
/opt/local/lib/mysql55/bin/mysqlcheck --all-databases --repair -u root --socket=/Applications/MAMP/tmp/mysql/mysql.sock

startMysql.sh

# /bin/sh
#/Applications/MAMP/Library/bin/mysqld_safe --port=3306 --socket=/Applications/MAMP/tmp/mysql/mysql.sock --lower_case_table_names=0 --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --log-error=/Applications/MAMP/logs/mysql_error_log &
/opt/local/lib/mysql55/bin/mysqld_safe --port=3306 --socket=/Applications/MAMP/tmp/mysql/mysql.sock --lower_case_table_names=0 --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --log-error=/Applications/MAMP/logs/mysql_error_log &

stop.sh

# /bin/sh
#/Applications/MAMP/Library/bin/mysqladmin -u root -proot --socket=/Applications/MAMP/tmp/mysql/mysql.sock shutdown
/opt/local/lib/mysql55/bin/mysqladmin -u root --socket=/Applications/MAMP/tmp/mysql/mysql.sock shutdown

動作確認

普通にアイコンダブルクリックでMAMPを起動するだけ。
ブラウザが立ち上がって下のような画面が出ればおk。

MAMP起動画面

phpMyAdminタブからエンジンを見てみるとストレージエンジンにmroongaが見える。

mroongaストレージエンジンを確認

これでテーブル作ったりデータ入れたりがGUIで出来るね!


Filed under: MySQL,phpmyadmin,メモ,開発環境

Trackback Uri






2012年 5月 9

※一番下の追記にありますが、Homebrewでインストールできるようになってます(2012/5/29リリース)

MySQL5.5のインストール

MANPでMySQL使えるんだけど、mroongaを(ローカルテストでも)使いたいので別にMySQLをインストールする。

ただしMySQLのバージョンは5.5をインストールしたいのでコマンドはこんな感じに。
mysql5 +server としてしまうとMySQL5.1.6が入ります。

MacBook:~ clicktx$ sudo port install mysql55 +server
Password:
--->  Deactivating mysql55 @5.5.23_0
--->  Cleaning mysql55
--->  Uninstalling mysql55 @5.5.23_0
--->  Cleaning mysql55
MacBook:~ clicktx$ sudo port install mysql55 +server
--->  Computing dependencies for mysql55
--->  Fetching archive for mysql55
--->  Attempting to fetch mysql55-5.5.23_0.darwin_10.x86_64.tbz2 from http://packages.macports.org/mysql55
--->  Fetching mysql55
--->  Verifying checksum(s) for mysql55
--->  Extracting mysql55
--->  Applying patches to mysql55
--->  Configuring mysql55
--->  Building mysql55
--->  Staging mysql55 into destroot
--->  Installing mysql55 @5.5.23_0
The mysql55 client has been installed.
To install the mysql55 server, install the mysql55-server port.
--->  Activating mysql55 @5.5.23_0
--->  Cleaning mysql55

MySQLの初期化

  • mac OSXの場合はmysqlユーザーは作成済みなので改めて作成する必要はない。
  • 実際は_mysql?mysqlでユーザー指定しても_mysqlで処理される。
MacBook:~ clicktx$ sudo -u mysql /opt/local/lib/mysql55/scripts/mysql_install_db
Password:
Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/opt/local/lib/mysql55/bin/mysqladmin -u root password 'new-password'
/opt/local/lib/mysql55/bin/mysqladmin -u root -h MacBook.local password 'new-password'

Alternatively you can run:
/opt/local/lib/mysql55/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /opt/local ; /opt/local/lib/mysql55/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /opt/local/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /opt/local/lib/mysql55/bin/mysqlbug script!

MySQLを起動する

MacBook:~ clicktx$ sudo /opt/local/share/mysql55/support-files/mysql.server start
Starting MySQL
... ERROR! The server quit without updating PID file (/opt/local/var/db/mysql55/MacBook.local.pid).

そのまま起動すると上記のようにエラーとなってしまう(自分の環境だけ?)

デフォルトでは /opt/local/var/run/mysql55 以下にソケットファイルを作成するらしく、フォルダが無いので作成する。アクセス権も777を与える。

MacBook:~ clicktx$ sudo mkdir -m 777 -p /opt/local/var/run/mysql55

改めてMySQLを起動。

MacBook:~ clicktx$ sudo /opt/local/share/mysql55/support-files/mysql.server start
Starting MySQL
.. SUCCESS! 

成功

参考:

  • Mac OS X に MacPorts で MySQL をインストールする – make world
  • MacPortsを使ってMySQL 5をインストールする – めも帖
  • mroongaのインストール

    2. インストールガイド — mroonga v2.02 documentation

    2.11.3. 前提条件
    MySQLおよびgroongaが既にインストールされている必要があります。
    またmroongaをビルドするためにはMySQLのソースコードも必要です。

    先日groongaはインストール済み。

    先程MacPortsでインストールしたMySQLのでソースは
    /opt/local/var/macports/distfiles/mysql55/mysql-5.5.23.tar.gz
    かな?

    作業スペースを~/src にする。
    まずは作業スペースとなるsrcフォルダを作成。

    MacBook:~ clicktx$ mkdir ~/src

    MySQLのソースファイルを ~/src にコピーして解凍する

    MacBook:~ clicktx$ cp /opt/local/var/macports/distfiles/mysql55/mysql-5.5.23.tar.gz ~/src/mysql-5.5.23.tar.gz
    MacBook:~ clicktx$ cd src/
    MacBook:~ clicktx$ tar xzvf mysql-5.5.23.tar.gz

    mroongaをダウンロード&解凍

    MacBook:src clicktx$ wget http://cloud.github.com/downloads/mroonga/mroonga/mroonga-2.02.tar.gz
    MacBook:src clicktx$ tar xzvf mroonga-2.02.tar.gz 
    

    mroongaをビルドする

    MacBook:src clicktx$ cd mroonga-2.02
    MacBook:mroonga-2.02 clicktx$ ./configure PKG_CONFIG_PATH=/opt/local/lib/pkgconfig --with-mysql-source=$HOME/src/mysql-5.5.23 --with-mysql-config=/opt/local/lib/mysql55/bin/mysql_config
    MacBook:mroonga-2.02 clicktx$ make

    makeでコケる…
    googleで漁っているとこんなの発見。
    installing mroonga on Mac OS X Lion — Gist
    早速試してみる。

    MacBook:~ clicktx$ cd ~/src/mysql-5.5.23/include
    MacBook:include clicktx$ ln -s probes_mysql_nodtrace.h probes_mysql_dtrace.h
    MacBook:include clicktx$ cd ~/src/mroonga-2.02
    MacBook:mroonga-2.02 clicktx$ aclocal -I /opt/local/share/aclocal
    MacBook:mroonga-2.02 clicktx$ automake -a
    MacBook:mroonga-2.02 clicktx$ autoconf
    MacBook:mroonga-2.02 clicktx$ autoheader
    MacBook:mroonga-2.02 clicktx$ automake -a
    MacBook:mroonga-2.02 clicktx$ ./configure PKG_CONFIG_PATH=/opt/local/lib/pkgconfig --with-mysql-source=$HOME/src/mysql-5.5.23 --with-mysql-config=/opt/local/lib/mysql55/bin/mysql_config --with-mecab
    MacBook:mroonga-2.02 clicktx$ make

    コケる…

    mroongaをMac OSXでビルドするためのアドホックなパッチを書いてみた « いわぶろ(ろてん)
    ココらへんに解決策?もう神頼み。
    https://gist.github.com/1015079 を参考に、~/src/mroonga-2.02/ha_mroonga.cpp っていうファイルの560行目付近に

    static_cast(static_cast(pthread_self())),

    っていう箇所があるから、

    static_cast(static_cast((unsigned long int)pthread_self())),

    に修正。
    pthread_self で検索すると修正箇所がすぐ分かる。

    修正した後にmakeしたら見事成功。

    MacBook:mroonga-2.02 clicktx$ sudo make install
    .....
    libtool: install: ranlib /opt/local/lib/mysql55/plugin/ha_groonga.a

    インストールできたぽい。

    公式ガイドに

    その後、mysqldを起動し、mysqlクライアントで接続して”INSTALL PLUGIN”コマンドでインストールします。

    とあるので、MySQL起動してインストール&確認。

    MacBook:~ clicktx$ sudo /opt/local/share/mysql55/support-files/mysql.server start
    MacBook:~ clicktx$ /opt/local/lib/mysql55/bin/mysql -u root
    mysql> INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';
    Query OK, 0 rows affected (0.48 sec)
    
    mysql> SHOW ENGINES;
    +--------------------+---------+------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                    | Transactions | XA   | Savepoints |
    +--------------------+---------+------------------------------------------------------------+--------------+------+------------+
    | CSV                | YES     | CSV storage engine                                         | NO           | NO   | NO         |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                         | NO           | NO   | NO         |
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
    | MyISAM             | YES     | MyISAM storage engine                                      | NO           | NO   | NO         |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
    | mroonga            | YES     | CJK-ready fulltext search, column store                    | NO           | NO   | NO         |
    +--------------------+---------+------------------------------------------------------------+--------------+------+------------+
    7 rows in set (0.00 sec)

    なんとか入ったみたい。
    苦労した…。

    なお参考ブログに

    なお,MySQLへの組み込み後の動作については,何も確認を行っていないのであしからず,です.(影響があるとしても,ログ出力部分だけ?)

    とあるように、とりあえずmake出来て、インストールまでこぎつけたってシロモノです。

    追記:2012/6/2
    エラーが出た時にはこちらが参考になります。
    MySQL の INSTALL PLUGIN に失敗する時の処方箋(mroonga-1.20編) – よし研 -日々クリエイション-

    また、mroongaはHomebrewでインストールできるようになったみたいです。こちらの方が簡単でしょう。MacPorts使っているボクは負けg(ry
    mroonga 2.03リリース


    Filed under: Mac,MySQL,インストールメモ,開発環境

    Trackback Uri