ラベル db の投稿を表示しています。 すべての投稿を表示
ラベル db の投稿を表示しています。 すべての投稿を表示

2017年6月8日木曜日

Laravelを Github + Circle CIで CIするまでの参考サイトまとめ


Laravel

前にメモしたリンク集。
floatingdays: 初めてのLaravel参考サイト
floatingdays: Laravelと Vue.jsのチュートリアル参考サイト

MySQL5.6以前だと出るエラーの対処方法。
他にもやり方はあるみたいだけど、ここのが公式?
Laravel 5.4: Specified key was too long error - Laravel News

テストを書くチュートリアル。
Laravel5.3以前の記事のようで、Laravel5.4からはページ遷移やページ内のテストは別途インストールが必要なLaravel Duskの管轄に変わったので、その部分は読み替えが必要。
Laravelでテストコードを書くためのチュートリアル - Qiita


Github

Githubを二要素認証にして、かつ、Githubへのpushをsshではなくhttpsでする方法。
ユーザー名とトークンの入力省略も。
https+アクセストークンを使ってGitHubのアカウントを使い分ける - Qiita

同じく入力省略について、こちらは.netrcに書く方法。
[Git][GitHub]GitHubにPushする際に認証失敗する | DevAchieve


Circle CI

DBまわりの設定。
seedはtest内でやるなら設定ファイルには要らないかも。
CircleCiでLaravelのMySQLを使ったテストを実行する - Qiita

APP_KEYをcircle.ymlに定義しないとエラーになるので書いておく。
エラーメッセージが分かりづらい → "RuntimeException: The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths."
Laravel アプリケーションを、 Circle CI 経由で AWS ElasticBeanstalk に自動デプロイ - Qiita

Circle CIで使えるPHPのバージョンの参考ページのリンクなど。
PHPプロジェクトにおけるCircle CIの設定 - Qiita

Circle CIからプロジェクトを削除せずにGithubからプロジェクトを削除すると、Circle CI側で削除できなくなる(ずっと読み込み中になる)。
対策は、Githubに同名のプロジェクトを作ればCircle CIから削除できるようになる。
相羽 大輔 (Daisuke AIBA)さんのツイート: "さっきの件、解決。CircleCIに登録したプロジェクトを削除するには「Project Settings > Stop Building on CircleCI」GitHub側で先に消すとCircleCIのプロジェクト設定が触れなくなるので注意。 #kzrb"

2016年1月9日土曜日

EC2の MySQLを S3にバックアップする方法(世代管理付き)


S3への送信はaws-cliが良さそう。
参考:aws-cli - AWS CLIでS3を操作する - Qiita


aws-cliはAmazon Linuxなら最初から入っているが、手元のインスタンスはconfigure等をするにはバージョンアップが必要だった。
yumでもバージョンアップできるが、今回は諸事情により依存関係のある諸々をそっとしておきたかったので、下記を参考にyumを使わずにaws-cliをバージョンアップ。

参考:AWSCLIで運用検討中の人必見! AWSCLIを使用したS3へのファイルコピー | クラウド工房 Powered by Amazon Web Services

sudo easy_install pip
sudo pip install awscli -U


IAMでS3のみに権限を絞り込んだユーザーを作り、その認証情報をconfigure。(もう少し権限を絞っても良いかも。)

aws configure

AWS Access Key ID [None]: (アクセスキーを入力)
AWS Secret Access Key [None]: (シークレットアクセスキーを入力)
Default region name [None]:
Default output format [None]:


世代管理はS3の機能であるバージョニングとライフサイクルを使う。
S3でバケットを作成し、バージョニングを有効化。
ライフサイクルでルールを追加。(例「以前のバージョン」を30日後に削除)


後は適当にダンプとS3へのコピーのスクリプトを作ってcronに登録する。
分かりやすいようにディレクトリを作成し、そこにスクリプトを作った。

バックアップ用スクリプト作成。
vi backup.sh

#!/bin/sh
echo "START " `date +'%Y/%m/%d %H:%M:%S'`
MYSQL_PWD='MySQLのパスワード' mysqldump -u MySQLのユーザー 対象DB > data.dump
aws s3 cp data.dump s3://バケット名/
echo "E N D " `date +'%Y/%m/%d %H:%M:%S'
(パスワード直書きにしたが、きちんとやるならMySQLのパスワードは隠したい。)

スクリプトのファイルに実行権限を付ける。
chmod 700 backup.sh

cronに登録。
crontab -e

0 1 * * * cd /スクリプトのディレクトリ; ./backup.sh >> history.log


aws-cliを使うと、AWSのサービス間の通信はSSL(TLS?)で暗号化されるようだ。
参考
aws — AWS CLI 1.9.17 Command Reference
By default, the AWS CLI uses SSL when communicating with AWS services.

Amazon Web Service aws cliはデフォルトで暗号化通信されるのか? - なぜか数学者にはワイン好きが多い



S3を使わずにサーバ上で世代管理するだけなら、下記が一番分かりやすかった。
mysqldumpをcronで1日1回取得し、バックアップ用ファイルを保存する - サイト制作の豆知識

2013年11月9日土曜日

MySQLで 「ERROR 2006 (HY000) at line xxx MySQL server has gone away」

調べたことをメモしておく。


mysqldumpでエクスポートした1GB余りのデータをインポートする時に、下記エラーが発生。

ERROR 2006 (HY000) at line 351 MySQL server has gone away

対策

インポート時に「MySQL server has gone away」が発生したときの対処 | 南紀熊野ウェブサービス(大阪、新宮市)

max_allowed_packet = 32M



今度は下記エラーが発生。

ERROR 2013 (HY000) at line xxx: Lost connection to MySQL server during query

対策


Importing 1GO SQL File => ERROR 2013 (HY000) at line 23: Lost connection to MySQL server during query - Stack Overflow

max_allowed_packet = 1100M
net_write_timeout = 300



駄目。次。

ERROR 2013 (HY000): Lost connection to MySQL server during query - MySQL

innodb_force_recovery = 4



下記エラー。

ERROR 1051 (42S02) at line xx: Unknown table 'xxxxx.xxxxx'



これは?

ERROR 2013 (HY000): Lost connection to MySQL server during query - Dev Shed

innodb_force_recovery = 3



同じエラー。innodb_force_recoveryはやめる。



MySQL Lists: mysql: Re: ERROR 2013 (HY000): Lost connection to MySQL server during query

connect_timeout = 6000

単位は秒?



駄目。



【結論】原因は、メモリ不足だった。

2013年7月5日金曜日

MySQL 5.6を RPMからインストール

現時点でyumに無いMySQL5.6をAmazon Linuxにインストールするメモ。
バージョン番号は現時点での最新版なので必要に応じて読み替えること。


インストール

  1. yum install MySQL-*.rpm

chkconfigに登録しようと見てみたら、もうmysqlが登録されてた。


初期設定


2011年11月14日月曜日

PDOでテーブルの列名を全て取得する方法

テーブルの列名を取得するには、MySQLならDESCRIBEで簡単にできるが、PostgreSQLだとpg_attributeカタログから取得しないといけないらしい。

でもPDOを使えばMySQLでもPostgreSQLでも取得できた。

$pdo = new PDO("$driver:dbname=$db", $user, $password);
$pdoStatement = $pdo->query("SELECT * FROM $table_name LIMIT 0");

$columns = array();

for ($i = 0; $i < $pdoStatement->columnCount(); $i++) {
    $meta = $pdoStatement->getColumnMeta($i);
    $columns[] = $meta['name'];
}

var_dump($columns);

もしテーブルに1行以上データがあることが保証されているなら普通に1行SELECTして連想配列の列名見れば済む話だが、データなしでも動くようにしたらこうなった。


ただし、PDOStatement->getColumnMeta()のマニュアルを見ると、
この関数は、 実験的 なものです。この関数の動作・ 名前・その他ドキュメントに書かれている事項は、予告なく、将来的な PHP のリリースにおいて変更される可能性があります。 この関数は自己責任で使用してください。
PDO ドライバの全てが PDOStatement::getColumnMeta(). をサポートしているわけではありません。
と書いてあり、PHPやDBのバージョンによっては上手く動かないかもしれないが、とりあえず手元の環境では動いた。


これでPHPでO/R Mapperを作りたい人も安心だ。

2011年11月2日水曜日

Seasar2入門の参考サイトとプロダクト選択のメモ

久しぶりにJava村に帰ってきた浦島さんの玉手箱メモ。


まずは概要を把握。



一口にSeasar2と言ってもたくさんプロダクトがあるので、Webアプリを作る場合にどのプロダクトを使うべきか調査。

  • MVCは、S2Struts or SAStruts or Teedaのどれがいい?
    • S2StrutsかSAStrutsだとどっち?
    • SAStrutsとTeedaでは?
      • Teeda
        • TeedaはJSFの実装
        • Teeda Extensionを使えばHTMLをテンプレートにできる
      • 「Seasarの問題点など」にそろそろ一言いっておくか - ひがやすを blog
        ただ、無責任に何でも自由というのは良くないので、SAStrutsとS2JDBCの組み合わせが、もっとも無難だというメッセージを出しているわけです。
      • SAStrutsとS2JDBCを作ったわけ - ひがやすを blog
        TeedaとS2Daoは、基本的に規約ベースのフレームワークです。規約を知っていれば、本当にさくさく開発できます。でも、規約ベースなので、規約を知らないと、何にもできなくなっちゃう。この辺が、大規模開発には向かないところ。
        SAStrutsとS2JDBCは、大規模案件にも耐えられるように最初から設計されています。
      • 感想:チームでの開発や今後のメンテを考えると、参考情報も経験者も多いStrutsの名前を冠するSAStrutsに比べてTeedaは学習コストがかかりそう
    • 結論:SAStrutsが無難
  • S2JDBC or S2Daoのどっちを使う?
    • HibernateとS2DaoとS2JDBCの考え方 - ひがやすを blogより引用
      • S2Daoについて
        S2DaoはSQLを中心に考えます。とはいえ、すべてのSQLを開発者が書くのは効率が悪いので、挿入、更新、削除は、S2DaoがSQLを自動生成しますが、検索は、開発者にSQLを書いてもらいます。
        デメリットは、SQLを書くのが面倒なことです。また、検索の結果セットごとにDTOを作らなければいけないので、DTOが増える傾向があります。
        Webのフレームワークとの組みあわせでいくと、Teeda Extensionは、S2Dao(DTO)と相性が良いように設計されているので、Teedaを使う場合は、S2Daoが良いと思います。
      • S2JDBCについて
        S2JDBCは、エンティティ(Java)とテーブル(データベース)は、同一のモデルだとみなしています。また、複雑なSQL以外は、すべて自動生成します。
        デメリットは、エンティティの設計が、テーブルに引きずられ、完全にドメインをあらわしたものにならないこと。
    • 感想
      • S2DaoはINSERT/UPDATE/DELETEのSQL自動生成と、手作りしたSQLの実行をしてくれるみたい
      • S2JDBCはDAOではなくApache CommonsのDbUtilsのようなSQLビルダー?
    • 結論:TeedaでないならS2JDBCで



久しぶりにJavaの世界に帰ってきたら、昔使ってたStruts1.3(1.x系は1.3で止まってるとは意外)のラッパーであるSAStrutsと、同じく昔使ってたJakarta Commons(現在は昇格してApache Commons)のDbUtilsに似たS2JDBCが最前線だなんて、奇遇と言うか、あるいは必然なのかな。

2011年10月3日月曜日

MySQLの dumpと restore


文字コード設定がされていないサーバからダンプする時に文字化けすることの対策のメモ。


dump

mysqldump -u user_name -p --compact --default-character-set=binary db_name > dump.sql

restore
DB(Schema)を作ってから、
sed 's/latin1/utf8/g' dump.sql > dump_utf8.sql
mysql -u user_name -p db_name < dump_utf8.sql

バイナリで出して文字コードの記述を置換してから取り込む。


参考

2010年10月26日火曜日

ファイル1つだけで出来ている 便利なPHP製ツールいろいろ

PHPライブラリは新時代に入った。定番だったphpMyAdminやPEAR::Mailはもう古い。最近は1ファイル配置するだけで簡単に使える便利なツールが増えてきた。

例えばこんなの。



次は1ファイルのフレームワークだね。(Google Code上にはもうたくさん公開されてるけど...)
あるいは1ファイルのブログシステムやWikiか?

2010年8月15日日曜日

CentOS5.5に PostgreSQL8.4をインスール&セットアップする手順

手順のメモ。

古いpostgresがインストールされていたので削除。

yum remove postgresql*
釣られてhttpd(Apache)もアンインストールされたが今回は構わない。


yumでpostgresをインストール。(CentOS5.5からは標準のyumリポジトリにPostgreSQL8.4がある。今までのpostgresと区別するために名前に"84"が付いている。)
yum install postgresql84-server
以下がインストールされる。
  • postgresql84-libs
  • postgresql84
  • postgresql84-server

必要に応じてdevelもインストール。
yum install postgresql84-devel


合わせてLinuxユーザーとして"postgres"が登録されるので、ユーザーを切り替える。
su postgres


初期化。
initdb --encoding=UTF-8 -D /var/lib/pgsql/data/
--encoding=UTF-8は無いとまずい?
--no-locale
は要るのかな?


rootに戻り起動。
/etc/init.d/postgresql start


OS起動時にpostgresが起動するようにしておく。
chkconfig postgresql on

2010年5月28日金曜日

SQLの集計関数で NULLを含む列を集計する場合の注意点

MySQLとPostgreSQLの話。他のRDBMSは試してない。


SQLでNULLを含む列を集計する場合、NULLの行は無視される。

SELECT
  SUM(t.v) -- => 15
, MIN(t.v) -- => 0
, MAX(t.v) -- => 10
, COUNT(t.v) -- => 3 (NULLの行も入れれば4行)
, AVG(t.v) -- => 5.0000 (NULLの行をゼロと考えれば3.75)
FROM (
  SELECT NULL v
  UNION
  SELECT 0 v
  UNION
  SELECT 5 v
  UNION
  SELECT 10 v
) t
(PostgreSQL 8.4とMySQL 5.1で確認。)


SUM()やMIN()、MAX()では問題ないが、COUNT()やAVG()ではNULLの行の分も含めて計算したい場合に困る。

そういう場合、COALESCE()でNULLをゼロに変換するとよい。
SELECT
  COUNT(COALESCE(t.v, 0)) -- => 4
, AVG(COALESCE(t.v, 0)) -- => 3.7500
FROM (
  SELECT NULL v
  UNION
  SELECT 0 v
  UNION
  SELECT 5 v
  UNION
  SELECT 10 v
) t

MySQLの場合はIFNULL()でもOK。


参考
PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Conditional Expressions
MySQL :: MySQL 5.5 Reference Manual :: 11.2.3 Comparison Functions and Operators

2010年4月5日月曜日

PostgreSQLで(ほぼ)リアルタイムにバックアップを取る方法

いろいろあるみたい


外部ツール



本体の機能

2010年3月20日土曜日

Webブラウザで DBを参照・更新・管理できるツールいろいろ

クラウドの時代ですから。

個人的にお薦めなのはAdminer。一般受けしそうなのはSQL Buddy。


MySQL用(上の方が使いやすい)

  • Adminer
    • PHP1ファイルのみ(無理に1ファイルにすることないと思うけど)。設置すれば設定不要ですぐ使える
    • シンプルだが普段使う機能は一通り揃ってる。シンプルだからこそ使いやすい
    • SQLをガリガリ書きたい人にお薦め
    • データのclone(コピー)ができるのが何気に便利
    • 見た目は少々無骨。CSSファイルをダウンロードすればSkinを変えられる
    • 昔はphpMinAdminという名前だったが改名した
    • 通常版より"English only"の方が少しファイルサイズが小さい。そんなに変わらないか
    • ライセンスはApache License
  • Adminer Editor
    • Adminerの簡易版。データの参照・登録・更新・削除だけしかできない
    • 別途Extensionsを用意しないと動かないようだ
    • データをいじるだけならこれでいいかも。逆に、データをいじる以上のこと(テーブルの変更とか、DBのDROPとか)をさせたくないユーザー向けに渡すのにちょうどいい(それを意識して作ったんだと思う)
  • SQL Buddy
  • phpMyAdmin
  • MySQL Quick Admin
    • 見た目はわりと良い。Ajaxでサクサク動く
    • 最初にconfig.phpを編集する必要があるみたい(ログイン機能がうまく動かなかったので)
    • SELECTのSQLを自分で書けない?実用するには辛いかも
    • 最後のUpdateは2007年6月。PHP5.3で動かすとDeprecatedが出る
    • ライセンスは明記されていないが、フォーラムにこんなやり取りが書いてあった
  • PHP Mini Admin for MySQL
  • Webadmin-mysql
    • あまり使われていない?


PostgreSQL用


これらのツールのようにPHPでつくっちゃえば、DB側がバージョンアップしてもphp-pdo/php-mysqlが対応してくれるので、ツール側での対応は特にいらないというのはクライアントアプリのツールには無い利点だと気付いた。

2009年8月12日水曜日

Rubyの ActiveRecordについてのメモ

しばらく離れていたらすっかり忘れてる。
調査したことのメモ。
微妙に仕様変わってる。


基礎:ActiveRecordを使ってみる « UK STUDIO


検索して見つからない場合の戻り値:ActiveRecord find時の戻り - 忘れやすいのでメモ - Yahoo!ブログ
(検索方法によってnilだったり空の配列だったり、例外が投げられたり)


find_first()とfind_all()は無くなった:同じくActiveRecord find時の戻り - 忘れやすいのでメモ - Yahoo!ブログ


最大値等のSQLでいう集約関数:RDBMSの集約関数の結果をActiveRecordで取得する方法 - 森薫の日記


ランダムに1件取り出す:
 そんな悲しい目をしないで » Blog Archive » Rails ActiveRecord でランダムにレコードを取得する方法
 Mysql で、ランダムにレコードを取り出す方法 - kaeruspoon
(RAND()を使う方法は行数と同じだけRNAD()を実行するわけだから、行数が多い場合はしんどそう)


find_by_xxx()とfind_all_by_xxxについて:ActiveRecordで検索-find_by_* - うなの日記

Railsの migration

メモ。


概要:Ruby on Rails : migration 機能でデータベーススキーマを変更する - WebOS Goodies

詳細:Ruby on Rails : migration 機能リファレンス - WebOS Goodies

データ型について等:FFTT : RailsのMigration

MySQLの数値型の:limitについて、上記参考サイトでは桁数を指定するように書いてあるが、手元のRails2.3.3ではバイト数を指定するようだ。
なのでbigintの場合は :limit => 8 にする。


参考:MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.2 数値タイプ

2009年1月26日月曜日

WWW SQL Designer 2.3.2 変更メモ

WWW SQL Designerのバージョンが2.3.2に上がっていたのでUPDATE。
そこで、自分でカスタマイズした点を反映するメモ。やりたい変更内容は以前のバージョンと同じ。

参考:
 floatingdays: WWW SQL Designerのインストール&設定
 floatingdays: WWW SQL Designerの Save ・ Loadをスマートに改良


変更箇所
(全角のスペースは普通のインデントに変換してから使うこと!)

  • js/config.js
    • 9行目の変更:デフォルトの保存方法をファイルに変更
      DEFAULT_BACKEND:["php-mysql"],

      DEFAULT_BACKEND:["php-file"],
  • js/wwwsqldesigner.js
    • 1201行目を変更:保存時のプロンプトにURLから保存名を取得して表示する
      var name = prompt(_("serversaveprompt"),"");

      var name = prompt(_("serversaveprompt"), location.href.split("=")[1]);
    • 1212行目に追加:ロード時のURLの後ろにに保存名を付ける
      if (!keyword) {
       var name = prompt(_("serverloadprompt"),"");
       if (name) {
        location.href = "?keyword=" + encodeURIComponent(name);
       }
       return;
      }
    • 1538~1539行目の変更:外部キーはどのフィールドでも作成可能にする
      this.dom.foreigncreate.disabled = !(this.selected.isPrimary());
      this.dom.foreignconnect.disabled = !(this.selected.isPrimary());

      this.dom.foreigncreate.disabled = false;
      this.dom.foreignconnect.disabled = false;

v8cgiのインストールと簡単なサンプル

v8cgiWWW SQL Designerを作ったondrej.zara氏が作ったサーバサイドJavaScript実行環境&ライブラリ。
CGI感覚で手軽にJavaScriptでWebプログラムが書ける。(さらに、テンプレート機能を使えばPHP感覚で書ける。)

ソースとWindows用のバイナリが配布されている。
メールライブラリや画像ライブラリ(GD)、テンプレートライブラリなどが付属している。


Windowsへのインストール
(参考:Installation - v8cgi - How to install v8cgi - Google Code

  1. v8cgi - Google CodeからZIPをダウンロード。展開して適当なフォルダに置く。(例:C:\test\v8cgi)
  2. v8cgi.confをCドライブの直下(コンパイル時に指定された場所)に移動する。
  3. v8cgi.confの中身を編集。(パスを環境に合わせる。)
    (例)
    // put default .js and .dll files here
    Config["libraryPath"] = "c:/test/v8cgi/lib";
  4. コマンドプロンプトからv8cgi.exeを実行してみる。エラーが無ければOK。
    C:\test\v8cgi>v8cgi.exe
    Nothing to do.
  5. Apacheの設定ファイルhttpd.confにCGI実行の設定を追加。
    (例)
    <Location /v8cgi>
     Options +ExecCGI
     AddHandler cgi-script .ssjs
    </Location>
    ※mod_cgiが有効になっていなかったら有効にしておく。
    LoadModule cgi_module modules/mod_cgi.so
  6. Apacheを再起動。
  7. Webのディレクトリにテスト用のScriptを作る。(例:htdosc\v8cgi\exaple.ssjs)
    (例 1)
    #!/test/v8cgi/v8cgi.exe
    response.write("Hello v8cgi!");
     ※responseオブジェクトはデフォルトでインスタンスが生成されている。(参考:API_HTTP - v8cgi - Library "http.js" - Google Code
    (例 2)
    #!/test/v8cgi/v8cgi.exe
    System.stdout("Content-type: text/plain\n\n");
    System.stdout("Hello v8cgi!");
     ※response.writeを使わない場合、Content-typeを出力しないと500 Internal Server Error(Premature end of script headers: example.ssjs)になる。
  8. 上記のファイルにアクセスしてみる。エラーが無ければOK。



DBを使う例
#!/test/v8cgi/v8cgi
library("mysql.dll");
library("query.js");

Query.setDB(new MySQL().connect("localhost", "db_user", "db_password", "schema"));

var result = new Query(Query.SELECT)
 .field("id").field("name") //SELECT
 .table("members") //FROM
 .where("%f = %s", "name", "TARO") //WHERE
 .execute();

response.write(result.numRows() + "<br>");

var rows = result.fetchObjects();
for (var i = 0; i < rows.length; i++) {
 response.write(rows[i]["id"] + ":" + rows[i]["name"] + "<br>");
}


テンプレートを使う例
テンプレートを呼び出すファイルの記述
#!/test/v8cgi/v8cgi
library("template.js");

var t = new Template({suffix: "tpl.html"}); //現行バージョン(0.2.0)にはバグがあるのでsuffixを指定しないとエラーになる
var var1 = "abc"; //動的なデータは変数に入れておけばテンプレート内から参照できる
var var2 = 123;
response.write(t.process("example")); //現行バージョン(0.2.0)ではdataを渡しても無視される

テンプレートの記述(example.tpl.html)
<html>
<head><title>TEST</title></head>
<body>
This is a random number: $(Math.random())

$code( for(var i = 0; i < 10; i++) { )
<li>$(i)</li>
$code( } )

$(var1) $(var2)
</body>
</html>


REQUEST情報を取り出す方法
"HTTP_"で始まる情報はrequest.header()で取り出せるが、それ以外は直接_headersの中から取り出すしか無さそう。
#!/test/v8cgi/v8cgi
response.write(request._headers["SCRIPT_URL"]);


感想
  • シンプルでよい。ソース追って理解できる。
  • DBアクセス、テンプレートエンジン、メール送信と揃っていて、即戦力っぽい。
  • DAOがORマッパーでなくSQLヘルパーなのが好き。さすがERDを描くためにツールを作ってしまった人だけある。
  • DBアクセスがプレースホルダーでないのが残念。escapeはしているようだがPreparedでないと何かと嫌。

  • response.writeってのがASPみたいでちょっと嫌。echo()とかでラップすればよいが。
  • 実際に使うとしたらmod_rewriteを絡めたオレームワーク(オレオレ・フレームワーク)を被せることになりそう。



参考:Apache Tutorial: CGI による動的コンテンツ - Apache HTTP サーバ

2008年12月22日月曜日

MySQLの timestampの自動更新ができない場合の修復方法

例えばcreated_atにはINSERT文でvalueにシステム時刻をセットし、updated_atは自動更新させることを想定している場合。

下記のように、間違えてtimestamp型の列を複数定義すると、2つ目以降のtimestampは初期値がオールゼロになり、自動更新もされない。

DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

間違いに気づいて、Query Browserからテーブル定義を変更(created_atをdatetimeにして、updated_atのdefaultにCURRENT_TIMESTAMPをセット)しても、自動更新はされない。
なぜなら、Query Browserからテーブル定義を変更してtimestampにした場合、下記のようにON UPDATEの定義が無いから。
DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Query Browserは、外部KEY以外のトリガーを作成できない。
なのでSQL文(DDL TDL)で列の定義を修正する。

ALTER TABLE members MODIFY updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP


修正できた。
DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

参考:MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

2008年9月6日土曜日

CakePHPで特殊な用途に使われるテーブルのフィールド名



CakePHP 1.2で bakeするメモ

CakePHP1.2では、bakeはこんな感じで実行できる。

cake bake

cakeコマンドはCAKE_HOME/cake/consoleディレクトリにあるが、bakeはアプリケーションを作りたいディレクトリ上で実行する必要がある。WindowsではCakePHP のおいしい食べ方: [1.2]Easy Bake on Windowsを参考にすると楽。オプションとしてappのパスを指定できた。
cake -app /path/to/app bake


bakeでのModelの作成はDBのテーブルを元にするので、DBにテーブルが1つも無いと怒られる。
テーブルを作ってからbakeすること。
Welcome to CakePHP v1.2.0.7296 RC2 Console
---------------------------------------------------------------
App : app
Path: CAKE_HOME/app
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> M
---------------------------------------------------------------
Bake Model
Path: CAKE_HOME/app/models/
---------------------------------------------------------------
Error: Your database does not have any tables.

bakeでModelを作るとオプションでvalidationも付けられる。
が、maxLengthなど値を指定するルールをbakeでどうやって指定するかわからない。

ブログ アーカイブ

tags