最近覚えたSQLAlchemyのTips

先週は、レガシーなOracleデータベースと格闘していた(文字エンコーディングの件もその一つ)。

__table__と__tablename__の違い

__table__は適切に設定済みのテーブルに対して使うらしい。自分でごちゃごちゃと設定したい場合は__tablename__と__table_args__を使うべし

複合プライマリーキーでのone-to-many

主キーが複合プライマリーキーの場合はそれぞれにprimary_key=Trueをつけるが、外部キーで一対多の関連付けをしたい場合には __table_args__で外部キー設定をしておく。

class Protocol(Base):
    __tablename__ = 'tblprotocol'
    id = Column("id", String(32), primary_key=True)
    version = Column("version", String(11), primary_key=True)
    name = Column("name", String(255))

class Experiment(Base):
    __tablename__ = 'tblexperiments'
    __table_args__ = (ForeignKeyConstraint(['protocolid','protocolversion'],
                                      ['tblprotocol.id', 'tblprotocol.version']), {})
    id = Column("id", String(32), primary_key=True)
    protocolid = Column("protocolid", String(32))
    protocolversion = Column("protocolversion", String(11))
    name = Column("name", String(255))
    protocol = relationship("Protocol", backref="experiments")

そもそも主キーの無いテーブル

主キーの無いテーブルはエラーが出るので、適当に複合キーを設定してプライマリーキーにしてしまう。

その他

SQLもORマッパーもわかっていればバランスの取れた設計になっていいのではなかろうかと思った。ORマッパー側から考えたほうがER図が綺麗になりそうだし。

ProductName 達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
ミック
翔泳社 / 2520円 ( 2008-02-07 )


経済指標の簡単な説明

鉱工業生産指数って今でもモノづくりの実態をあらわしているのかな?

その他の指標

  • 毎月勤労統計調査
  • 企業物価指数と消費者物価

Persistentでキーから検索する方法

昨日の三島Haskell無名関数の会(mishima.hs)で「PersistentのKeyってどうやって作るの?」っていう話になって、宿題として持ち帰ったので朝から調べていた。

Keyは

type Key val = KeyBackend (PersistEntityBackend val) val

で、KeyBackendのデータコンストラクタがKeyなので、PersistValueのデータコンストラクタで包めばいいみたい。

ひとつレコードを作って、キーを指定して年齢を変更した後、キーでレコードを取ってきて年齢が変わっていることを確認するサンプル。SQLitのキーがInt64なのでこのサンプルではPersistInt64データコンストラクタを使っている。

{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
{-# LANGUAGE GADTs, FlexibleContexts #-}
import Database.Persist
import Database.Persist.Sqlite
import Database.Persist.TH
import Control.Monad.IO.Class (liftIO)
import Database.Persist.Store

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Person
    name String
    age Int Maybe
    loc String default="Japan"
    deriving Show
|]

main :: IO ()
main = withSqliteConn "test.db" $ runSqlConn $ do
    runMigration migrateAll
    kzfmId <- insert $ Person "kzfm" (Just 20) "Fuji"
    liftIO $ print kzfmId
    kzfm <- getJust kzfmId
    liftIO $ print kzfm
    kzfm2 <- replace (Key (PersistInt64 1)) (kzfm {personAge = Just 36})
    liftIO $ print kzfm2
    kzfm3 <- getJust (Key (PersistInt64 1))
    liftIO $ print (personAge kzfm3)

どういうメソッドがあるのかはDatabase.Persist の関数群を簡単に説明が参考になる。

三島Haskell無名関数の会 第2回目とホルモン

やりました。virthualenvを快適に使うためのvirthualenvwrapperの話と、

静的サイトジェネレーターのHakyllの話をしてきた。Hakyllは導入するとこで時間切れになってしまったので残念。結構便利だと思うので、もっと広まって欲しい。

懇親会は鈴木屋で。

1361621625

Virthualenvwrapperとは

Haskellでサンドボックス環境を構築するにはvirthualenvcabal-devがポピュラーだと思います(が後者は使ったことない)。

virthualenvを使う場合、仮想環境を構築したいディレクトリに移動してvirthualenvコマンドを叩いてファイルのコピーなどをした後に source .virthualenv/bin/activateで仮想環境に入る必要があるため、以下の問題があります。

  • 仮想環境が増えていくとディレクトリの管理が大変になってくる
  • virthualenv -> source .virthualenv/bin/activateはルーチンなので面倒くさい

Virthualenvwrapperはこれらを解決するものです。virthualenvwrapperを使うと、

  • 仮想環境は.virthualenvディレクトリ以下に作成される(mkvhenv)
  • 仮想環境のディレクトリに移動してactivateをするコマンドを提供(workhon)
  • 仮想環境のリスト(lsvirthualenv)
  • 仮想環境削除(rmvirthualenv)

なかなか便利です。

Ni Ten Ichi RyuはTeebee remixよりもオリジナルのほうが好きやな

Vicious Nature -> Ni Ten Ichi Ryu -> Tap Hoのつながりが気に入った。繋いだログを取ってあるからエッジ(つながり)にRating付けられればいいんだが。

このログはd3.jsで遊ぶネタとしても面白いかもしれない。

Darkness Dub / Subwave
Underprint / Noisia & Alix Perez
Stoppit / Spor
Natures Call / Blue Motion
Skip Rope / Need For Mirrors
Dream Killer (Audio Remix) / Cause4Concern
Halogen / Spor
Horus / Billain
Vicious Nature / Ant Miles & Boneshaker
Ni Ten Ichi Ryu / Photek
Tap Ho / TC
Sacrifice / Noisia & The Upbeats
Shape Of Things To Come / Calyx & Teebee
Reflections / B-Complex
MEMORIES / SUBWAVE
Amen Alley / Danny Byrd

SQLAlchemyとOracleの文字化け問題と闘った

WindowsのOracleにアクセスしてSQLAlchemyを使おうとすると日本語が化ける。

engine = create_engine("xxxxxxxx", encoding='cp932')

とcreate_engineまわりをいじっても全然改善できない。これはcx_Oracleまわりかなぁとそっち方面を攻めたら解決したのでメモ。

Oracleのエンコーディングを調べる

対象のDBにアクセスしてコマンドを叩く

SELECT value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET';

JA16SJISTILDEという文字列が返ってきた。

環境変数を設定する

スクリプト中で環境変数を設定する

import os
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE"

これで解決した。

ProductName 超変換!! もじバケる6 20個入 BOX (食玩)

バンダイ / 2100円 ( 2012-12-12 )


サカナクションの新譜

予約した

ProductName sakanaction (初回生産限定盤CD+DVD)
サカナクション
ビクターエンタテインメント / 3036円 ( 2013-03-13 )


吟醸酒の来た道

木桶って扱いが大変なんだなぁと思いながら。仙禽って木桶仕込みだったよなぁ。

ProductName 吟醸酒の来た道 (中公文庫)
篠田 次郎
中央公論社 / ?円 ( 1999-01 )


酵母、麹、醪、精米といった、酒造りに必須な要素のブレークスルーが面白く書かれていて楽しく読めた。

逆に酒造りをひと通り理解していないと、面白さが伝わらないと思う。

もちろん日本酒(臥龍梅)を呑みながら読んだ。

「生物と無生物のあいだ」はエッセイ

タイトルの答えは書かれていなかった。最後もノックアウトでうまくいかなかったという話で終わっていて、GP2のノックインとかSNPsとかの考察がなくて、ノックアウトがうまく埋め合わせられた(と思っている)という主観で終わっているので、科学読み物として読むと非常に不完全燃焼感が高いかも。

ゲーデルの不完全性定理を解いた(と自分では思っている)と書かれたみたいな読了感。

エッセイとして読めば面白い。

ProductName 生物と無生物のあいだ (講談社現代新書)
福岡 伸一
講談社 / 777円 ( 2007-05-18 )