僕は木になりたい。。。

子供のとき本気でそう思ってました。 理由は樹齢が長いから

mysql

MySQLでWEBアプリ用のユーザ作成3

いつも忘れるので、
ここに書いておく。
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX ON テーブル.ホスト TO 'ユーザID'@'ホスト' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
こうすると、
「ホスト」から接続した場合のみ「テーブル」にアクセス可能なユーザが作成できる。

gem install mysql にハマる5

Rails2.2.2では、mysqlがデフォルトでは使えず、

gem install mysql
をやれと言われました。

やってみる。

$ sudo gem install mysql
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby
        --with-mysql-config
        --without-mysql-config
        --with-mysql-dir
        --without-mysql-dir
        --with-mysql-include
        --without-mysql-include=${mysql-dir}/include
        --with-mysql-lib
        --without-mysql-lib=${mysql-dir}/lib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-mlib
        --without-mlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-zlib
        --without-zlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-socketlib
        --without-socketlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-nsllib
        --without-nsllib
        --with-mysqlclientlib
        --without-mysqlclientlib


Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/gem_make.out
失敗。。

どうやら、 mysql_configの場所を教えてあげないとダメらしい。

やってみる。

$ sudo gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb install mysql -- --with-mysql-config=/usr/bin/mysql_config
checking for mysql_ssl_set()... no
checking for mysql.h... no
checking for mysql/mysql.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby
        --with-mysql-config


Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/gem_make.out
失敗。。

どうやら、 mysql-develが必要らしい。

インストールしてみる。

$ sudo yum install mysql-devel
Loaded plugins: refresh-packagekit
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package mysql-devel.i386 0:5.0.51a-1.fc9 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mysql-devel             i386       5.0.51a-1.fc9    fedora            2.4 M

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 2.4 M
Is this ok [y/N]: y
Downloading Packages:
(1/1): mysql-devel-5.0.51a-1.fc9.i386.rpm                                                                                                                                                  | 2.4 MB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : mysql-devel                                       [1/1]

Installed: mysql-devel.i386 0:5.0.51a-1.fc9
Complete!
お、入った。

で、やってみる

sudo gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
Building native extensions.  This could take a while...
Successfully installed mysql-2.7
1 gem installed

よし、OK

MySQLで知っておくと良いかもしれない事5

初めてのRuby
この本を買いました。
どうも評判が良いようで、おもわず買ってしまいました。
まだ、読んでないのですが。。。

著者のYuguiさんのブログを読んでいたら、以下のようなエントリーがあり、結構びっくりして、調べた結果をエントリーします。
知っている人にとっては当たり前なのかもしれませんが。。

Active Recordが不適当なキャッシュを返す(?)問題 @ 2006年05月 @ ratio - rational - irrational @ IDM
ActiveRecordが誤ってキャッシュか何かを返している感じ。これで数時間嵌まった。
新規レコードをsave後、find_by_id(nil)すると、初回の呼び出しに限りsaveしたオブジェクトがマッチする。
MySQLが不適当なレコードを返す問題。 @ 2006年06月 @ ratio - rational - irrational @ IDM
Active Recordから変なレコードが返ってくるのは、Active Recordの問題かと思ったらMySQLの問題だった。Active Recordよ、疑って済まなかった。
とういう事で、自分でもmysqlで上記のようなSQLを実行してみた。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 878 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
+----+------+------------+------------+------------+
| id | name | tagkind_id | created_at | updated_at |
+----+------+------------+------------+------------+
| 21 | test |       NULL | NULL       | NULL       |
+----+------+------------+------------+------------+
1 row in set (0.00 sec)

やはり、同じ結果になります。
で、MySQLのマニュアルを調べてみると、 この動作は仕様みたい。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.1.3 比較関数と演算子
ODBC プログラムとうまく適合させるため、IS NULL を使用する場合、MySQL は次の追加機能をサポートします :
  • 一番最近の AUTO_INCREMENT 値を含む行を、その値を生成した直後に、次のフォームのステートメントを発行することによって検索することができます :
          SELECT * FROM tbl_name WHERE auto_col IS NULL
    
  • この動作は、SQL_AUTO_IS_NULL=0 を設定すると無効になります。項12.5.3. 「SET 構文」 を参照してください。
なるほどね。
set SQT_ATUO_IS_NULL=0 を発行すれば、OKなようなので、もう一度試してみました。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 879 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> set SQL_AUTO_IS_NULL=0;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
Empty set (0.00 sec)

おお。
でもこれって、デフォルトで0で良いんじゃないか??
と思いつつ、じゃあ、ActiveRecordはって事で調べてみると、
File: CHANGELOG
# MySQL: SET SQL_AUTO_IS_NULL=0 so ‘where id is null’ doesn‘t select the last inserted id. 6778 [Jonathan Viney, timc]
って事で、とっくに対応されてるって事ですね。
安心安心。

Rails 初期データ投入時の auto_increment項目のクリア4

Railsのmigrate機能で初期データ登録用のマイグレーションファイルを 作りました。
でも、何度かmigrationをしているうちに、
auto_incrementで採番される値はクリアされないので、
どんどん大きくなっていってしまいます。
他のテーブルで外部参照しておりキーの値が変わっては困るのです。
で、最初は以下のようにマイグレーションファイルを作成しました。
class ImportStatusInitialData < ActiveRecord::Migration
  def self.up
    down
    Status.create( :status => 1, :name => "AA" )
    Status.create( :status => 2, :name => "BB" )
    Status.create( :status => 3, :name => "CC" )
    Status.create( :status => 4, :name => "DD" )
    Status.create( :status => 5, :name => "EE" )
    Status.create( :status => 6, :name => "FF" )
  end

  def self.down
    Status.delete_all
    execute "alter table statuses auto_increment=0"
  end
end
見て分かるとおり、ネイティブSQLを書いています。
イケてないので、メソッド化します。
RAILS_HOME/lib/schema_statements.rb
ファイルを以下のように作りました。
module ActiveRecord
  module ConnectionAdapters # :nodoc:
    module SchemaStatements
      # ID列 ( autoincrement項目 ) の 順序値を設定する。
      def set_autoincrement_number(table_name, number)
        execute "ALTER TABLE #{quote_table_name(table_name)} AUTO_INCREMENT=#{number}"
      end
    end
  end
end
で、rakeの時に上記ファイルを読み込むようにする為、
RAILS_HOME/Rakefileに以下を追記
require 'lib/schema_statements'
そしてマイグレーションファイルを変更
class ImportStatusInitialData < ActiveRecord::Migration
  def self.up
    down
    Status.create( :status => 1, :name => "AA" )
    Status.create( :status => 2, :name => "BB" )
    Status.create( :status => 3, :name => "CC" )
    Status.create( :status => 4, :name => "DD" )
    Status.create( :status => 5, :name => "EE" )
    Status.create( :status => 6, :name => "FF" )
  end

  def self.down
    Status.delete_all
    set_autoincrement_number :statuses, 0
  end
end
そして、rake db:migrateを実行!!
== 10 ImportStatusInitialData: migrating 
======================================
== 10 ImportStatusInitialData: reverting ======================================
-- set_autoincrement_number(:statuses, 0)
   -> 0.0139s
== 10 ImportStatusInitialData: reverted (0.0176s) =============================

== 10 ImportStatusInitialData: migrated (0.0388s) =============================
バッチリです。 
あ、これ mysql でしか調べてないです。
あと、処理を追加するファイルの置き場所とかここで良いのか?
livedoor プロフィール

emosei

記事検索
読書をしよう
楽天市場
こちらもどうぞ
Archives
RSS
  • ライブドアブログ