Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

UNION句を久しぶりに使ったのでメモ

テストデータを整備するのに、YというテーブルのIDを外部キーとして持っているA〜Dのテーブルのレコードを集めて1つの表にする必要がありました。

こういう時はUNIONの出番です。

select 
  zzz.id,
  zzz.name
from (
  selct 
    y.id,
    y.name,
  from
     y_table as y
     join a_table as a on a.y_id = y.id --A_table
  union
  selct 
    y.id,
    y.name,
  from
     y_table as y
     join b_table as b on b.y_id = y.id --B_table
  union
  selct 
    y.id,
    y.name,
  from
     y_table as y
     join c_table as c on c.y_id = y.id --C_table
  union
  selct 
    y.id,
    y.name,
  from
     y_table as y
     join b_table as d on d.y_id = y.id --D_table
  ) as zzz

派生テーブルにしておけばorder_byもwhere句も使えます。zzzの後に。

ただ、MYSQLの場合はUNIONした結果をFROM句に持ってくるのはサブクエリでしか無いので、WHEREをFROM句の外に書いてしまうと爆裂重くなるかもしれません。その時はUNIONしたい集合をはじめからWHEREで絞りましょう。

SQLを学習できるWebサービスを作りました。

www.start-sql.net

SQLのFROM句はテーブルである必要はございません!

どうもそのように思っている方が多い気がしたので。

FROM句に指定できるのはテーブルそのものではなく、SELECT文を発行した結果でも指定できます。派生テーブルという表現をすることが多いみたい。

PostgreSQLのマニュアルでもそんなような事が書いてあります。

FROM句は、カンマで分けられたテーブル参照リストで与えられる1つ以上のテーブルから、1つのテーブルを派生します。

テーブル参照は、テーブル名(スキーマで修飾することもできます)、副問い合わせによる派生テーブル、結合の組み立て、またはこれらの複雑な組み合わせからなります。

https://www.postgresql.jp/document/9.5/html/queries-table-expressions.html#queries-from

派生テーブルの例

こんなやつ。from句でテーブルではなくSQLの選択結果をFROMに入れています。

select
 *
from
  (
    select
        id,
        user_id,
        access_path,
        created
    from
        logs
    where
        year(created) = 2015
    order by
        id desc
) as tmp_table 
group by 
  user_id

SQL集合論ですから。集合指向の言語であります。

オヌヌメ

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

SQLAlchemyでDB固有の関数を実行する

難しいことはありませんでした。

以下はMySQLのtruncateという切り捨ての関数を使う例です。

rs = Item.query.\
  filter(Item.maker_id == param['maker_id']).\
  filter(func.truncate(Item.gedai / Item.price, 1) < 0.6).all()

SQLAlchemyのfuncオブジェクトは空気が読めるナイスガイなので、funcの後にDB関数名をそのまま書いて実行することが出来ます。

上記の例ですと、「truncate(items.gedai / items.price, %s) < %s」というSQLに変換されて実行してくれます。

また、SQLAlchemyのORMapperが生成されたSQLを確認するには、下記のように行います。Queryオブジェクトを引数に取ります。

def print_sql(query):
    '''
    debug用途でSQL文を吐き出す
    '''
    from sqlalchemy.dialects import mysql
    print(query.statement.compile(dialect=mysql.dialect()))

I ♥ SQLAlchemy!! Yummy!!

iPad mini4 を活用すべく検討していること

Macbook Pro Retinaが正直重たいので、出先ではiPad miniのSIMフリーモデルに切り替えようとしています。僕の利用用途の90%は満たしてくれるので。

足りないものがこの2つ。

Sketch3 / Prottのようなツール

Sketch3でスケッチ書いてそれを紙芝居のように見せるアプリは流石にない。iOSにサーバーを立てるのは難しいみたい。

開発/実行環境

エディタはあるけど実行環境は無いからね。こればっかりはね。

あとはキーボードとスタイラスペンとカバーを買えば、完璧。

2016.03.25 追記

iPad Pro 9.7が出ました。これで決まりですわ。

以下、自分用メモ。これらをセットアップすればノートPCは持ち運ぶ必要がなくなる。

用途 アプリ
メール Spark
データ Google Drive
オフィス Excel,Powerpoint
打ち合わせメモ Evernote
ssh,sftp Coda
VCS CodeBucket,Git
Mysql MySQL QueryDB
リモートデスクトップ Splashtop

リモートデスクトップがあれば、母艦のマシンにアクセスできるのでそこでどうとでもできるわな〜

お友達からのお仕事を逃げるように断った話

数年に1回思い出したかのように連絡がある学友から、Web制作をどう進めるか悩んでる的な話があった。

こちらで簡単な資料を作って内部で検討する分にはええやろと思って持って行ったが、その学友の話している内容がさっぱりわからん。自分にはどう進めていいかわからんから、プロジェクトはあんたがオーナーである親戚の叔父を焚き付けて立ち上げてくれ、自分は集客(笑)を担当するから、だって。平たく言えばそういうことだった。

まぁ集客は少なからず必要なことだから、「どうやるつもりなんや」と聞いたら、セミナーに言って勉強してくると言ってきたので、ああ、コイツはオレを出汁にして自分のやりたいことだけをやる気なんだって思った。上手く行かなったら、逃げるような気がした。

なので、プロジェクトオーナーの叔父さんに「提案はしますし、条件面で折り合えば仕事はします。ですが、あの方と一緒に仕事するに当たっては僕の下につけますよ。あくまでも素人ですから。」ってメールで根回ししたら、そっくりそのまま学友にメールの内容を見せてしまった。内密にお願いしたのに... 抱えきれないんですかあなたは...

それを聞いた学友は裏切られた気持ちになったみたいで、僕に怒りの連絡があった。失礼なやつだあんたは、この仕事をするな、と。ん? それを決めるのはあなたではないし、立ち上げできないのにどうやって進めるつもりなのって強めに問い詰めたら、もうええんじゃボケ的なメールが来た。売り言葉を仕掛けたワイもワイだが、冷静にならずに買ってくるあなたもご立派だなぁと。

これはお金の問題じゃない。仮に僕の思うような体制が作れても間接的に接点を仕事でもってしまう限り、いつかは面倒なことになるだろう。無茶振りされる悪寒がしたので、学友にはキレ気味にもうこれ以上お話することはありませんと一方的にドアを閉めて、着信拒否に設定した。プロジェクトのオーナーには学友とのやり取りを転送して「かくかくしかじかで、仕事ができそうにないのですいません。」とメールした。

これで終わったな〜と思ってたら、学友がメールで謝罪しますと言ってきた。「はぁ?」っていうニュアンスで返信したら、そんな言葉を使うなんてひどいだって。お前謝罪したいんちゃうか。どうやったら償えるのか、責任を取る為に何が必要なのか考えてないんやなと落胆したので、その旨を返信して、迷惑メール設定を行いました。

僕の立場から語っているし至らぬ点はあったと思うけど、先方からは信じられる言葉が何一つもらえなかった。自分が手を入れたら良い結果になると思ったから未練は多少あったけど、そこが一番ガックリ来た。いくら求められても逃げるしか無いこともあるんだなって、改めて感じた。

自分の気持ちの整理が出来たので、同じような話にお悩みの人に参考になればと思って、書き散らしておきます。