カテゴリー: プログラミング

MySQLとPostgreSQLと・・・

投稿者:isc_blog

PHP+PostgreSQL(8.2.4)用に開発したアプリケーションをPHP+MySQL(5.1.22)に移植しようとした際に引っかかった点を書き残しておきます。

まず、はじめに私自身はどちらかというとOracleのSQLが最も得意で
あとは順に MySQL>SQLServer>PostgreSQL>Other という感じのスキルです。

で、今回、PHP+PostgreSQLでの開発だったのですが
PostgreSQLが大得意な方ならもっとこう違った書き方があるじゃん!という書き方をしていない前提です。

なので普段MySQL向けのSQLを書くことが多い方がPostgreSQLを使用する場合の注意点と言ってもいいかもしれません。

では、本題。

【日付の計算が違う】
例えば
データ投入日付が10日以内のデータを表示する・・・
みたいなSQL文です。

PostgreSQLの場合
[sql]
SELECT *
FROM user_tbl
WHERE CAST(insert_date AS DATE) + CAST(’10 days’ AS INTERVAL) >
current_timestamp
[/sql]
こんな感じ・・・

MySQLの場合だと
[sql]
SELECT *
FROM uset_tbl
WHERE DATE_ADD(insert_date, INTERVAL 10 DAY) > NOW()
[/sql]
こんな感じになります。

結構、こんな感じのSQLが多いと大変ですね。

【LIMIT OFFSETの使い方が違う】
PostgreSQLの場合は
[sql] 
offset 100 limit 10
[/sql]
と書いた場合
100件目から10件抽出 という意味なんですが

MySQLの場合は
[sql]
limit 100,10
[/sql]

100件目から10件抽出になります。
MySQL5以降の場合実はPostgreSQLから継承した書き方も出来ます。
[sql]
limit 10 offset 100
[/sql]
これも同じです。(10件中抽出、100件目から。)

で、問題なのが、PostgreSQLの場合は 「100件目から全部」みたいなSQL
[sql]
offset 100
[/sql]

が書けるのに対し、MySQLでは「limit」を書かずに「offset」を書くことが出来ないため
同じSQLは書けません。
※実際に試してNGだったのと、いろいろ調べましたがどの文献も「limit」の限界ありきのものしかなく「offset」の使用に関しても「limit」ありきな見解だったので「出来ない」と思っています。なにか手は無いものでしょうか。
※まぁ、Oracleならもっと複雑に書くべきところなので仕方ないですね。PostgreSQLのメリットということで・・・
※参考まで・・・Oracleでのlimit,offsetもどきを実践してくださっている文献

【MySQLのauto_incrementは・・・PostgreSQLで・・・】
MySQLのauto_increment はPostgreSQLで SERIAL になります。
具体的には

MySQL
[sql]
CREATE TABLE tablename (
colname MEDIUMINT NOT NULL AUTO_INCREMENT
);
[/sql]

PostgreSQLでは・・・・

[sql]
CREATE TABLE tablename (
colname SERIAL
);
[/sql]
すでに存在するテーブルに対して追加で行う場合は
[sql]
ALTER TABLE tablename ADD COLUMN 列名 SERIAL
[/sql]
となります。



今回あまり複雑なSQLを書いていないのでこのくらいです。

2011年8月3日

CodeIgniterのすすめ Active Recordクラス

投稿者:isc_blog

CodeIgniterについて何度かご紹介してきていますが
ここんとこSeasar2(Javaのフレームワーク。個人的にはJavaのフレームワークの中で一番好きかな。)っぽいなぁ~と思ったActive Recordクラスについて
ご紹介します。

Seasar2の中でもS2JDBCっていうSeasar2のO/Rマッパーで・・・
っていうか
まぁ、百聞は一見にしかず・・・ってことでこんなコードでDB検索を可能にしています。
[java]
List<Employee> results = jdbcManager.from(Employee.class)
.join("department")
.where("id in (? , ?)", 11, 22)
.orderBy("name")
.getResultList();
[/java]
これって実際のSQLは・・・・こんな感じ
[sql]
select T1_.ID, T1_.NAME, T1.DEPARTMENT_ID, T2_.ID, T2_.NAME
from EMPLOYEE T1_ left outer join DEPARTMENT T2_ on T1_.DEPARTMENT_ID = T2_.ID
where T1_.ID in (?, ?)
order by T1_.NAME desc
[/sql]
※SQL文内の「?」に 「11」「12」が入ってくる感じです。

これをCodeIgniterのActive Recordクラスで書くと・・・
[php]
$this->db->select(‘employee.id,employee.name,employee.department_id,department.id,department.name’);
$this->db->from(‘employee’);
$this->db->join(‘department’, ‘department.id = employee.id’,’left’);
$this->db->where_in(‘id’, array(’11’,’12’));
$this->db->order_by("employee.name", "desc");
$query = $this->db->get();
[/php]
こんな感じ(間違ってたらごめんなさい)
もしかしたらCodeIgniterの方が直感的かもしれない。

どちらももっと複雑なSQLの場合は直接SQL文節をかけちゃう
「S2JDBC」
[java]
List<Employee> results = (List<Employee>) entityManager.createQuery(
"select e from Employee e left join fetch e.department" +
" where e.id in (?1, ?2) order by e.name")
.setParameter(1, 11)
.setParameter(2, 22)
.getResultList();
[/java]

「CodeIgniter」
[php]
$this->db->select(‘(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4′) AS amount_paid’, FALSE);
$query = $this->db->get(‘mytable’);
[/php]

フレームワークを導入したせいでガチガチでどうしようもなくなる(またはフレームワークのせいでSQL構文を合わせないといけない・・・)というフレームワークではつかれるので、こういうところは柔軟であってほしい。

やはりいいフレームワークだと思います。

久々に書いたけどS2JDBCも強力だなぁ~
Java書きたくなってきたー
※Androidは書いてるか・・・

2011年8月2日

eclipseからSubversionで管理しているプロジェクトのエクスポートが出来た。

投稿者:isc_blog

eclipseでプロジェクト管理していて
Subclipseプラグインなんかを使っていて
いざ納品!っていうときにSubversionのファイル・フォルダが満載で「嫌だなぁ」と思っていたらこんな機能があったので覚え書きチックに書き留めておきます。

eclipse上の納品物を出したいプロジェクトを右クリック

Team (日本語版は読み替えてください)

Export (日本語版は読み替えてください)

すると、出力先を聞かれるので適当なところを選択して「OK」。

プロジェクト名のフォルダが出力されているので中身を見てみると・・・

.svn やら なんやらのファイル・フォルダが無い!
スッキリ!

普通はこんなことは知っているのか・・・
初めて知ったw

2011年7月26日

言語によるデータ処理の違い

投稿者:isc_blog

@ITで興味深い記事があったのでご紹介します。

特集:人気言語でのデータ処理の比較

C#/Scala/Python/Ruby/F#でデータ処理はどう違うのか?

こちらの記事では
それぞれの言語でのデータ処理について記述があり
言語の差が実際に見られます。

こういった記事が好きな私はちょっとマニアだな(自負)

2011年7月25日

WordPressプラグイン「Throws SPAM Away」に設定ページを付けました。

投稿者:isc_blog

先日公開したスパム対策プラグインに下記設定項目を付けたくて設定画面をつくることにしました。
・日本語が最低何文字含有している必要があるか  文字数
・日本語を含まない(最低文字数以下の場合含む)場合にちらっと出るエラー文言から元の記事に戻る時間(ミリ秒)

こちらを参考に設定ページを付けることにしました。

設定ページの作成|WordPress Codex 日本語版
感謝っ!

この設定付きバージョンを Version 1.2 として公開しました。
是非、バージョンアップしてください!

インストール後は左側のメニューから「Throws SPAM Away」メニューをクリックして設定画面が現れます。

海外からのスパム投稿にお悩みの方はぜひともインストールしてみてください。
こちらからどうぞ↓↓↓
Throws SPAM Away

2011年7月24日

WordPressのプラグインを作りました・・・海外からの英語コメントスパムに悩むあなたへ

投稿者:isc_blog

お客様からご依頼いただいていたサイト修繕で
前々から海外からの英語コメントスパムになやまされてきたそうなので
なにかないかと思い、探して入れていたのが
SI CAPTCHA Anti-Spam」というプラグインでした。
これは「文字列を画像にしたものを表示しその文字列を入力して正しくなければコメントを投稿することが出来ない」というものなのですが
これを超えて来る奴らがいるんですね。 (ご苦労様ですw)

で、これ以上のものは・・・と探したんですがなかなか見つからないので作ることにしました。

スパム対策の方式は下記の通り
・コメント欄にダブルバイトが含まれていないと投稿出来ない。
・投稿出来ない・・・といってもエラーにするのではなく「無視」して何事もなかったようにもとの記事に戻る。
・日本人用に「日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)」というコメントを表示する

以上です。

一応、このブログでも可動させています。

下記からダウンロード出来ます。
Throws SPAM Away
※ご使用の際は自己責任でお願いします。

前述のSI CAPTCHA Anti-Spamも併用できるので便利です。

調子にのってこちらのページを参考にWordPress.orgに申請してみました・・・
どうなることやら・・・・

課題としてはダブルバイトならOKなので中国語やハングル、ロシア語などは入ってしまうのです。

日本語で画像認証作ればいいのかも・・・と思いつつ今回はこれまで。

2011年7月21日

今日の調べ物・・・

投稿者:isc_blog

Android開発で・・・・「赤外線」を使ったアプリを作りたかったので・・・調べた結果

SH Developers Square – download 赤外線データ転送API概要

JavaScriptにてIEの時は・・・と書きたかったので・・・・調べた結果

phpSpot開発日誌より
JavaScriptでIEかどうかをたったの1行で判別する方法

CodeIgniterのセッションクラス

今日はいろいろ立てこんでますw

2011年7月19日

Google Analyticsデータからアクセスランキング

投稿者:isc_blog

Google Analyticsのデータからアクセスランキングを生成するPerlスクリプトというのを発見しました。

このブログでアクセスランキング過去7日っていうのがそうなのかな・・・

ちょっとやってみようと思う今日この頃でした。
著者曰く「このコードはさくらインターネットで動作を確認していますが、ホスティング先によってはPerlのバージョンやライブラリの違いで動作しないかもしれません。」とのことなのでちょっと頑張ってみます。
7月中に出来るといいな・・・

2011年7月17日