<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>taichino.com &#187; database</title>
	<atom:link href="http://taichino.com/category/engineer-life/database/feed" rel="self" type="application/rss+xml" />
	<link>http://taichino.com</link>
	<description>永遠のネバーランド</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:33:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>postgresユーザのパスワード忘れて困った</title>
		<link>http://taichino.com/engineer-life/database/2616</link>
		<comments>http://taichino.com/engineer-life/database/2616#comments</comments>
		<pubDate>Wed, 25 Jan 2012 15:14:36 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2616</guid>
		<description><![CDATA[最近herokuをちょろっとだけ触っています。herokuではPostgreSQLが使われてるのでローカルにもインストールしたんですけど、ちょっと間が空いて、Postgresユーザーのパスワード忘れて困ったのでメモ書きです。環境はOSX 10.6です。 ちょっと検索すると本家MLの過去ログからビンゴなスレッドがありました。要はローカルからの接続時に認証を一旦外してパスワード変更後、元に戻すというものです。認証を設定しているのはpg_hba.confというファイルで僕の手元では下記の位置にありました。md5(パスワード認証)となっている認証形式をtrustに書き換えます。 $ sudo vim /Library/PostgreSQL/9.1/data/pg_hba.conf - local all all md5 + local all all trust 設定ファイルを修正後に再起動すると、postgresユーザでパスワードなしでログインできます。あとはALTER USERでパスワードを変更しましょう。 $ sudo -u postgres ./bin/pg_ctl restart -D/Library/PostgreSQL/9.1/data $ psql -U postgres postgres=# ALTER USER postgres WITH ENCRYPTED PASSWORD &#039;new password&#039;; postgres=# \q パスワードの変更が終わったら認証形式を元に戻しておきます。postgresユーザのパスワード忘れても何とか大丈夫なもんですね。 $ sudo vim /Library/PostgreSQL/9.1/data/pg_hba.conf + local all all trust - local all all [...]]]></description>
			<content:encoded><![CDATA[<p>最近herokuをちょろっとだけ触っています。herokuではPostgreSQLが使われてるのでローカルにもインストールしたんですけど、ちょっと間が空いて、Postgresユーザーのパスワード忘れて困ったのでメモ書きです。環境はOSX 10.6です。</p>
<p><span id="more-2616"></span></p>
<p>ちょっと検索すると本家MLの<a href="http://archives.postgresql.org/pgsql-admin/2005-02/msg00214.php" title="PostgreSQLでパスワード忘れたときの対処法" target="_blank">過去ログからビンゴなスレッド</a>がありました。要はローカルからの接続時に認証を一旦外してパスワード変更後、元に戻すというものです。認証を設定しているのはpg_hba.confというファイルで僕の手元では下記の位置にありました。md5(パスワード認証)となっている認証形式をtrustに書き換えます。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ sudo vim /Library/PostgreSQL/9.1/data/pg_hba.conf
- local   all             all                                     md5
+ local   all             all                                     trust
</pre>
<p>設定ファイルを修正後に再起動すると、postgresユーザでパスワードなしでログインできます。あとはALTER USERでパスワードを変更しましょう。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ sudo -u postgres ./bin/pg_ctl restart -D/Library/PostgreSQL/9.1/data
$ psql -U postgres
postgres=# ALTER USER postgres WITH ENCRYPTED PASSWORD &#039;new password&#039;;
postgres=# \q
</pre>
<p>パスワードの変更が終わったら認証形式を元に戻しておきます。postgresユーザのパスワード忘れても何とか大丈夫なもんですね。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ sudo vim /Library/PostgreSQL/9.1/data/pg_hba.conf
+ local   all             all                                     trust
- local   all             all                                     md5
$ sudo -u postgres ./bin/pg_ctl restart -D/Library/PostgreSQL/9.1/data
$ psql -U postgres
Password for user postgres:
</pre>
<p>一番最初に触ったデータベースがPostgreSQLだったので結構好きだったはずなんですけど、何年か使ってないくらいで綺麗サッパリ使い方を忘れていたので、ついでにちょっとだけリハビリです。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ psql -U postgres
postgres=# \l      # データベース一覧
postgres=# \c db1  # データベース選択
db1=# \dt          # テーブル一覧
db1=# \d table1    # テーブルスキーマ
db1=# \d SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database; # 各テーブルのサイズ
db1=# \q
</pre>
<p>herokuのShared Databaseもpsqlから接続できたら良いのになと思う今日この頃です。あとせめて50MBくらい容量欲しい。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/database/2616/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQLをlatin1のまま使ってて、Djangoからだと文字化けた話</title>
		<link>http://taichino.com/engineer-life/2223</link>
		<comments>http://taichino.com/engineer-life/2223#comments</comments>
		<pubDate>Sun, 10 Jul 2011 15:58:42 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2223</guid>
		<description><![CDATA[表題の通りMySQL適当に使ってたってだけの話なんですが、MySQLってインストールすると、デフォルトで文字コードは軒並みlatin1になってるわけです。utf8にしててくれても良いんじゃねと思わなくもないです。 mysql&#62; status; -------------- mysql Ver 14.14 Distrib 5.1.51, for apple-darwin10.3.0 &#40;i386&#41; using readline 5.1 ... Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 ... -------------- で、この設定のままutf8な文字列を突っ込んでて、でも別にmysqlコマンドやらpythonのMySQLdbやらから読み書きしても文字化けしないし、まぁ良いかと思ってほったらかしてた訳です。そしたらDjangoから読もうとしたら文字化けしたので、なんでやねんと思って調べたのでメモしておきます。 ちょっと調べたところDjangoはデータベースに対してutf8のデータを要求するようです。そうするとMySQLは自分の中にlatin1の文字列が入っていると思い込んでいるので、格納されている文字列をlatin1からutf8に変換しようとする訳ですね。結果utf8で格納されている文字列に対して、無理矢理latin1からutf8への変換をかけて化けるという事でした。 なぜDjango以外のケースで化けなかったかというと、クライアントがlatin1のデータを要求したせいで、データベースで変換処理が走らず、結果的には化けないと。まぁタマタマ動いていただけですね。ダメダメです。 さて化けてた理由はわかりましたが、すでにlatin1なテーブルにutf8で数十万件ほどデータを突っ込んでしまっています。my.cnfなんかで慌ててutf8な設定にしても当然解決されませんし、テーブルの文字コードを変更しても化けたままです。しょうがないから変換スクリプトでも書くかと思っていると、MySQLのリファレンスに解決方法が書かれていました。抜粋したものが以下になります。 ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8; リファレンスによるとテキストなカラムとblobなカラム間では変換処理は走らないようです。なのでblobを経由させると変換処理を発生させずに、MySQLにデータに対する認識を変更できるという事ですね。この場合はlatin1だと思われているutf8な文字列を、utf8として認識させ直すことができました。ちなみに僕は一度blobを介さずにutf8にalter tableして、バックアップを取ってなくて終わったと冷や汗をかきましたが、すがる思いでlatin1に再度alter tableしたら、元通りになりました。運がよかったのか、そういうものなのかは未検証です。 という訳で、文字コードlatin1のまま使って、やっちまった!と思ったけど、ALTER [...]]]></description>
			<content:encoded><![CDATA[<p>表題の通りMySQL適当に使ってたってだけの話なんですが、MySQLってインストールすると、デフォルトで文字コードは軒並みlatin1になってるわけです。utf8にしててくれても良いんじゃねと思わなくもないです。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mysql<span style="color: #000000; font-weight: bold;">&gt;</span> status;
<span style="color: #660033;">--------------</span>
mysql  Ver <span style="color: #000000;">14.14</span> Distrib 5.1.51, <span style="color: #000000; font-weight: bold;">for</span> apple-darwin10.3.0 <span style="color: #7a0874; font-weight: bold;">&#40;</span>i386<span style="color: #7a0874; font-weight: bold;">&#41;</span> using readline <span style="color: #000000;">5.1</span>
...
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
...
<span style="color: #660033;">--------------</span></pre></div></div>

<p>で、この設定のままutf8な文字列を突っ込んでて、でも別にmysqlコマンドやらpythonのMySQLdbやらから読み書きしても文字化けしないし、まぁ良いかと思ってほったらかしてた訳です。そしたらDjangoから読もうとしたら文字化けしたので、なんでやねんと思って調べたのでメモしておきます。</p>
<p><span id="more-2223"></span></p>
<p>ちょっと調べたところDjangoはデータベースに対してutf8のデータを要求するようです。そうするとMySQLは自分の中にlatin1の文字列が入っていると思い込んでいるので、格納されている文字列をlatin1からutf8に変換しようとする訳ですね。結果utf8で格納されている文字列に対して、無理矢理latin1からutf8への変換をかけて化けるという事でした。</p>
<p>なぜDjango以外のケースで化けなかったかというと、クライアントがlatin1のデータを要求したせいで、データベースで変換処理が走らず、結果的には化けないと。まぁタマタマ動いていただけですね。ダメダメです。</p>
<p>さて化けてた理由はわかりましたが、すでにlatin1なテーブルにutf8で数十万件ほどデータを突っ込んでしまっています。my.cnfなんかで慌ててutf8な設定にしても当然解決されませんし、テーブルの文字コードを変更しても化けたままです。しょうがないから変換スクリプトでも書くかと思っていると、<a href="http://dev.mysql.com/doc/refman/5.1/ja/alter-table.html">MySQLのリファレンスに解決方法が書かれていました</a>。抜粋したものが以下になります。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> t1 <span style="color: #993333; font-weight: bold;">CHANGE</span> c1 c1 <span style="color: #993333; font-weight: bold;">BLOB</span>;
<span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> t1 <span style="color: #993333; font-weight: bold;">CHANGE</span> c1 c1 TEXT <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8;</pre></div></div>

<p>リファレンスによるとテキストなカラムとblobなカラム間では変換処理は走らないようです。なのでblobを経由させると変換処理を発生させずに、MySQLにデータに対する認識を変更できるという事ですね。この場合はlatin1だと思われているutf8な文字列を、utf8として認識させ直すことができました。ちなみに僕は一度blobを介さずにutf8にalter tableして、バックアップを取ってなくて終わったと冷や汗をかきましたが、すがる思いでlatin1に再度alter tableしたら、元通りになりました。運がよかったのか、そういうものなのかは未検証です。</p>
<p>という訳で、文字コードlatin1のまま使って、やっちまった!と思ったけど、ALTER TABLE使えば何とかなったという話でした。まぁ最初から文字コードくらいちゃんと設定しとけという事ですね。</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">[mysqld]
default-character-set=utf8</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/2223/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pythonのORMを色々試してみた</title>
		<link>http://taichino.com/engineer-life/database/1344</link>
		<comments>http://taichino.com/engineer-life/database/1344#comments</comments>
		<pubDate>Thu, 10 Dec 2009 22:10:15 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[elixir]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[sqlalchemy]]></category>
		<category><![CDATA[sqlobject]]></category>
		<category><![CDATA[storm]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1344</guid>
		<description><![CDATA[そろそろpythonでもSQLを直に書くのが面倒になってきたので、O/Rマッパーを探してみたところ、幾つか種類があったので有名どころを使ってみることにしました。今回試したのは以下の4つです。 SQLAlchemy SQLObject Elixir Storm まず用途についてですが、僕はテーブルスキーマはSQLで直に書きますので、ORMでDDLを扱うつもりはありません。DMLを簡単に扱いたいというのが一番の目標です。そこで予め作成して置いたテーブルに対してCRUD操作のし易さを比べてみました。比較に使用したのは以下のテーブルです。 CREATE TABLE `books` &#40; `id` INT&#40;11&#41; NOT NULL AUTO_INCREMENT, `title` VARCHAR&#40;100&#41; DEFAULT NULL, `price` INT&#40;11&#41; DEFAULT NULL, `isbn` INT&#40;11&#41; DEFAULT NULL, PRIMARY KEY &#40;`id`&#41;, UNIQUE KEY `isbn` &#40;`isbn`&#41; &#41; まず最初に試したのは、SQLAlchemyです。ちょっと検索した感じでは一番使われてそうな雰囲気です。早速使ってみたところ以下のようになりました。一連の初期化処理でセッションを作成し、セッションを通してオブジェクトの操作を行います。ソースを見ての通りCRUD操作自体は直感的に行えるのですが、マッピングを明示的に行う事や、セッションの管理やDBハンドルの管理などやや煩雑です。ただドキュメントを読む限りでは、非常に高機能で細やかな制御が行えるようです。感想としてはもう少しデータベースを隠蔽して欲しいと思いました。create_engineやget_session等は本来書きたい処理ではありません。 #!/usr/bin/python # -*- coding: utf-8 -*- &#160; import sys from sqlalchemy import * from sqlalchemy.orm import * &#160; # [...]]]></description>
			<content:encoded><![CDATA[<p>そろそろpythonでもSQLを直に書くのが面倒になってきたので、O/Rマッパーを探してみたところ、幾つか種類があったので有名どころを使ってみることにしました。今回試したのは以下の4つです。</p>
<ul>
<li> <a href="http://www.sqlalchemy.org/">SQLAlchemy </a></li>
<li> <a href="http://www.sqlobject.org/">SQLObject</a> </li>
<li> <a href="http://elixir.ematia.de/trac/">Elixir </a></li>
<li> <a href="https://storm.canonical.com/">Storm</a> </li>
</ul>
<p><span id="more-1344"></span></p>
<p>まず用途についてですが、僕はテーブルスキーマはSQLで直に書きますので、ORMでDDLを扱うつもりはありません。DMLを簡単に扱いたいというのが一番の目標です。そこで予め作成して置いたテーブルに対してCRUD操作のし易さを比べてみました。比較に使用したのは以下のテーブルです。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`books`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`id`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`title`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`price`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`isbn`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`isbn`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`isbn`</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>まず最初に試したのは、SQLAlchemyです。ちょっと検索した感じでは一番使われてそうな雰囲気です。早速使ってみたところ以下のようになりました。一連の初期化処理でセッションを作成し、セッションを通してオブジェクトの操作を行います。ソースを見ての通りCRUD操作自体は直感的に行えるのですが、マッピングを明示的に行う事や、セッションの管理やDBハンドルの管理などやや煩雑です。ただドキュメントを読む限りでは、非常に高機能で細やかな制御が行えるようです。感想としてはもう少しデータベースを隠蔽して欲しいと思いました。create_engineやget_session等は本来書きたい処理ではありません。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> sqlalchemy <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> sqlalchemy.<span style="color: black;">orm</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># booksテーブルとマッピングするクラス</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Book<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, title, isbn=<span style="color: #008000;">None</span>, author=<span style="color: #008000;">None</span>, price=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
    <span style="color: #008000;">self</span>.<span style="color: black;">title</span>  = title
    <span style="color: #008000;">self</span>.<span style="color: black;">price</span>  = price
    <span style="color: #008000;">self</span>.<span style="color: black;">isbn</span>   = isbn
&nbsp;
<span style="color: #808080; font-style: italic;"># セッション(トランザクション)を取得する</span>
<span style="color: #ff7700;font-weight:bold;">def</span> get_session<span style="color: black;">&#40;</span>engine<span style="color: black;">&#41;</span>:
  Session = sessionmaker<span style="color: black;">&#40;</span>bind=engine<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">return</span> Session<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  engine = create_engine<span style="color: black;">&#40;</span><span style="color: #483d8b;">'mysql://root@localhost/sample'</span>, echo=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># echoでデバッグ出力</span>
  meta   = MetaData<span style="color: black;">&#40;</span>engine<span style="color: black;">&#41;</span>
  books = Table<span style="color: black;">&#40;</span><span style="color: #483d8b;">'books'</span>, meta, autoload=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># autoloadでテーブル情報を自動ロードする</span>
  mapper<span style="color: black;">&#40;</span>Book, books<span style="color: black;">&#41;</span>
&nbsp;
  session = get_session<span style="color: black;">&#40;</span>engine<span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># insert</span>
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    book1 = Book<span style="color: black;">&#40;</span><span style="color: #483d8b;">'1Q84'</span>, price=<span style="color: #ff4500;">2000</span>,  isbn=<span style="color: #ff4500;">1234567</span><span style="color: black;">&#41;</span>
    book2 = Book<span style="color: black;">&#40;</span><span style="color: #483d8b;">'リアル9'</span>, price=<span style="color: #ff4500;">630</span>, isbn=<span style="color: #ff4500;">9876543</span><span style="color: black;">&#41;</span>
    session.<span style="color: black;">add</span><span style="color: black;">&#40;</span>book1<span style="color: black;">&#41;</span>
    session.<span style="color: black;">add</span><span style="color: black;">&#40;</span>book2<span style="color: black;">&#41;</span>
    session.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># duplicate error</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># select</span>
  session = get_session<span style="color: black;">&#40;</span>engine<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> session.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Book<span style="color: black;">&#41;</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> b
&nbsp;
  <span style="color: #808080; font-style: italic;"># update</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> session.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Book<span style="color: black;">&#41;</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    b.<span style="color: black;">price</span> <span style="color: #66cc66;">*</span>= <span style="color: #ff4500;">1.05</span>
  session.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># just modify object's value and commit</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># delete</span>
  session = get_session<span style="color: black;">&#40;</span>engine<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> session.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Book<span style="color: black;">&#41;</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> b.<span style="color: black;">price</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">2000</span>:
      session.<span style="color: black;">delete</span><span style="color: black;">&#40;</span>b<span style="color: black;">&#41;</span>
  session.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
  main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>次に試してみたのがSQLObjectです。同じ処理を書いたコードが以下になります。SQLAlchemyと比べてとてもシンプルにまとまっています。セッション周りの煩雑なコードも不要ですし、またテーブル名を指定するだけで、自動的にカラムをロードしてくれるのも便利です。イメージしていたORMとかなり近く、もうこれで良いかなと思ったのですが、１つ気になる情報がありました。TurboGearsというWebフレームワークがバージョン1.xの際に採用していたSQLObjectを、2.xからSQLAlchemyに差し替えた事です。どうも複雑なデータベースを操作する際のパフォーマンスに問題があるというのが理由だそうです。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> sqlobject <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 他の処理に先立ってconnectionを作っておく必要がある</span>
sqlhub.<span style="color: black;">processConnection</span> = connectionForURI<span style="color: black;">&#40;</span><span style="color: #483d8b;">'mysql://root@localhost/sample?debug=1'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># booksテーブルにマッピングするオブジェクト</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Book<span style="color: black;">&#40;</span>SQLObject<span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">class</span> sqlmeta:
    table        = <span style="color: #483d8b;">&quot;books&quot;</span>
    fromDatabase = <span style="color: #008000;">True</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  <span style="color: #808080; font-style: italic;"># insert</span>
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    book1 = Book<span style="color: black;">&#40;</span>title=<span style="color: #483d8b;">'1Q84'</span>,   price=<span style="color: #ff4500;">2000</span>, isbn=<span style="color: #ff4500;">1234567</span><span style="color: black;">&#41;</span>
    book2 = Book<span style="color: black;">&#40;</span>title=<span style="color: #483d8b;">'リアル9'</span>, price=<span style="color: #ff4500;">630</span>,  isbn=<span style="color: #ff4500;">9876543</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># duplicate</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># select</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> Book.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> b.<span style="color: black;">title</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># update</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> Book.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    b.<span style="color: black;">price</span> = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>b.<span style="color: black;">price</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">1.05</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># delete</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> Book.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> b.<span style="color: black;">price</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">2000</span>:
      Book.<span style="color: black;">delete</span><span style="color: black;">&#40;</span>b.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
  main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>正直DBのパフォーマンスが問題になるようなアプリケーションは、まだ作れないのでSQLObjectでも良かったのですが、念のため他のORMを見ていると今度はElixirというモジュールが見つかりました。これはSQLAlchemyのラッパーで、乱暴な言い方をすればSQLAlchemyをSQLObjectの様に扱えるようになります。実際のコードは以下になります。マッピングが自動化されて、セッション管理なども簡潔に記述できるようになっています。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> elixir <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
metadata.<span style="color: black;">bind</span> = <span style="color: #483d8b;">'mysql://root@localhost/sample'</span>
metadata.<span style="color: black;">bind</span>.<span style="color: black;">echo</span> = <span style="color: #008000;">True</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># booksテーブルにマッピングするオブジェクト</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Book<span style="color: black;">&#40;</span>Entity<span style="color: black;">&#41;</span>:
  using_options<span style="color: black;">&#40;</span>tablename=<span style="color: #483d8b;">'books'</span>, autoload=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  setup_all<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># insert </span>
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    book1 = Book<span style="color: black;">&#40;</span>title=<span style="color: #483d8b;">'1Q84'</span>,   price=<span style="color: #ff4500;">2000</span>, isbn=<span style="color: #ff4500;">1234567</span><span style="color: black;">&#41;</span>
    book2 = Book<span style="color: black;">&#40;</span>title=<span style="color: #483d8b;">'リアル9'</span>, price=<span style="color: #ff4500;">600</span>,  isbn=<span style="color: #ff4500;">9876543</span><span style="color: black;">&#41;</span>
    session.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  session.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># select</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> Book.<span style="color: black;">query</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> b
&nbsp;
  <span style="color: #808080; font-style: italic;"># update</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> Book.<span style="color: black;">query</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    b.<span style="color: black;">price</span> <span style="color: #66cc66;">*</span>= <span style="color: #ff4500;">1.05</span>
  session.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># delete</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> Book.<span style="color: black;">query</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> b.<span style="color: black;">price</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">2000</span>:
      b.<span style="color: black;">delete</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  session.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
  main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>これはもうElixirで決まりと思ったのですが、ウノウラボのブログに「<a href="http://labs.unoh.net/2008/04/pythonorm1.html">PythonのORMを研究してみる(1) </a>」という記事があり、そこでSQLAlchemyやSQLObjectが選択肢にある中でStormを紹介しますと言っているのが気になって、Stormでも書いてみました。以下がソースになります。オブジェクトのコンストラクタを自分で書かないと駄目なのが気になります。また僕の使い方が良くないのか、データベースに登録された日本語が化けてしまいました。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> storm.<span style="color: #008000;">locals</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> storm.<span style="color: black;">tracer</span> <span style="color: #ff7700;font-weight:bold;">import</span> debug
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Book<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
  __storm_table__ = <span style="color: #483d8b;">'books'</span>
  <span style="color: #008000;">id</span>    = Int<span style="color: black;">&#40;</span>primary=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
  title = Unicode<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  price = Int<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  isbn  = Int<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, title, price, isbn<span style="color: black;">&#41;</span>:
    <span style="color: #008000;">self</span>.<span style="color: black;">title</span> = title
    <span style="color: #008000;">self</span>.<span style="color: black;">price</span> = price
    <span style="color: #008000;">self</span>.<span style="color: black;">isbn</span>  = isbn
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  debug<span style="color: black;">&#40;</span><span style="color: #008000;">True</span>, stream=<span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: black;">&#41;</span>
  db = create_database<span style="color: black;">&#40;</span><span style="color: #483d8b;">'mysql://root@localhost/sample'</span><span style="color: black;">&#41;</span>
  store = Store<span style="color: black;">&#40;</span>db<span style="color: black;">&#41;</span>
&nbsp;
  book1 = Book<span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'1Q84'</span>, <span style="color: #ff4500;">2000</span>, <span style="color: #ff4500;">123456</span><span style="color: black;">&#41;</span>
  book2 = Book<span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'リアル'</span>, <span style="color: #ff4500;">600</span>, <span style="color: #ff4500;">987654</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># insert </span>
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    store.<span style="color: black;">add</span><span style="color: black;">&#40;</span>book1<span style="color: black;">&#41;</span>
    store.<span style="color: black;">add</span><span style="color: black;">&#40;</span>book2<span style="color: black;">&#41;</span>
    store.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    store.<span style="color: black;">rollback</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># select</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> store.<span style="color: black;">find</span><span style="color: black;">&#40;</span>Book<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> b
&nbsp;
  <span style="color: #808080; font-style: italic;"># update</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> store.<span style="color: black;">find</span><span style="color: black;">&#40;</span>Book<span style="color: black;">&#41;</span>:
    b.<span style="color: black;">price</span> <span style="color: #66cc66;">*</span>= <span style="color: #ff4500;">1.05</span>
  store.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># delete</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> store.<span style="color: black;">find</span><span style="color: black;">&#40;</span>Book<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> b.<span style="color: black;">price</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #ff4500;">2000</span>:
      store.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>b<span style="color: black;">&#41;</span>
  store.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
  main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><strong>まとめ</strong><br />
というわけでまとめですが、上の４つでいうとElixirかSQLObjectが使い易いと思いました。オブジェクトとテーブルの自動マッピングが出来るのでコード量がかなり減ります。どちらを使うか迷うのですが、総合判断でElixirを使う事にしました。いざという時にSQLAlchemyの機能にアクセスできるのが、何となく安心だというのが理由です。</p>
<table border="1" style="text-align:center">
<tr>
<th>ORM</th>
<th>サンプルコードの行数</th>
<th>使い心地</th>
<th>ドキュメント</th>
</tr>
<tr>
<td>SQLAlchemy</td>
<td>56</td>
<td>△</td>
<td>◎</td>
</tr>
<tr>
<td>SQLObject</td>
<td>38</td>
<td>◎</td>
<td>◯</td>
</tr>
<tr>
<td>Elixir</td>
<td>42</td>
<td>◯</td>
<td>◯</td>
</tr>
<tr>
<td>Storm</td>
<td>53</td>
<td>△</td>
<td>△</td>
</tr>
</table>
<p>本来ならベンチマークを入れるべきところですが、それは又の機会という事で。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/database/1344/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQLiteでCSVのインポート／エクスポートしたい件</title>
		<link>http://taichino.com/engineer-life/database/1016</link>
		<comments>http://taichino.com/engineer-life/database/1016#comments</comments>
		<pubDate>Wed, 23 Sep 2009 18:15:15 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1016</guid>
		<description><![CDATA[データベースを使っていると、よくcsvファイルと相互に変換したくなります。MySQLやPostgreSQLでは標準でcsvのインポート/エクスポートができるので、SQLiteでも出来るだろうという事で調べてみました。 結論から言うとSQLiteで使えるCSVのインポート/エクスポートは制約が強くて使い辛いです。というのも、カラムの文字列内にセパレータ(標準ではカンマ)が含まれている場合は、クォートされていても、セパレータとして認識されてしまい、正常なcsvとして扱われないからです。(例えば&#8221;Hi, Nice to meet you.&#8221;は２カラムとして扱われます。) ちなみにSQLite標準のインポート／エクスポートは以下のように行います。 # 標準で以下のようにインポート／エクスポートできるが、セパレータが上手くパースされない .mode csv TABLE_NAME # エクスポート SELECT * FROM TABLE_NAME # インポート .import sample.csv TABLE_NAME カラム内にセパレータが無ければ標準のままで行けますが、そんな事はイチイチ考えてられないので、pythonで簡単にインポート／エクスポートを実装してみました。 #!/usr/bin/python # -*- coding: utf-8 -*- &#160; import sqlite3 import csv &#160; # SQLite内のデータはutf-8を想定 def sqlite2csv&#40;db_name, table_name, out_filename&#41;: dbh = sqlite3.connect&#40;db_name&#41; writer = csv.writer&#40;file&#40;out_filename, 'w'&#41;&#41; for row in dbh.execute&#40;'SELECT * FROM [...]]]></description>
			<content:encoded><![CDATA[<p>データベースを使っていると、よくcsvファイルと相互に変換したくなります。MySQLやPostgreSQLでは標準でcsvのインポート/エクスポートができるので、SQLiteでも出来るだろうという事で調べてみました。</p>
<p><span id="more-1016"></span></p>
<p>結論から言うとSQLiteで使えるCSVのインポート/エクスポートは制約が強くて使い辛いです。というのも、カラムの文字列内にセパレータ(標準ではカンマ)が含まれている場合は、クォートされていても、セパレータとして認識されてしまい、正常なcsvとして扱われないからです。(例えば&#8221;Hi, Nice to meet you.&#8221;は２カラムとして扱われます。)</p>
<p>ちなみにSQLite標準のインポート／エクスポートは以下のように行います。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"># 標準で以下のようにインポート／エクスポートできるが、セパレータが上手くパースされない
<span style="color: #66cc66;">.</span>mode csv <span style="color: #993333; font-weight: bold;">TABLE_NAME</span>
# エクスポート
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #993333; font-weight: bold;">TABLE_NAME</span>
# インポート
<span style="color: #66cc66;">.</span>import sample<span style="color: #66cc66;">.</span>csv <span style="color: #993333; font-weight: bold;">TABLE_NAME</span></pre></div></div>

<p>カラム内にセパレータが無ければ標準のままで行けますが、そんな事はイチイチ考えてられないので、pythonで簡単にインポート／エクスポートを実装してみました。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">csv</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># SQLite内のデータはutf-8を想定</span>
<span style="color: #ff7700;font-weight:bold;">def</span> sqlite2csv<span style="color: black;">&#40;</span>db_name, table_name, out_filename<span style="color: black;">&#41;</span>:
  dbh = sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>db_name<span style="color: black;">&#41;</span>
  writer = <span style="color: #dc143c;">csv</span>.<span style="color: black;">writer</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#40;</span>out_filename, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> dbh.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT * FROM %(table_name)s'</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">locals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
    writer.<span style="color: black;">writerow</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>col.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf-8'</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>col, <span style="color: #008000;">unicode</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">else</span> col <span style="color: #ff7700;font-weight:bold;">for</span> col <span style="color: #ff7700;font-weight:bold;">in</span> row<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
  dbh.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># csvのセパレータはカンマを想定</span>
<span style="color: #ff7700;font-weight:bold;">def</span> csv2sqlite<span style="color: black;">&#40;</span>db_name, table_name, in_filename<span style="color: black;">&#41;</span>:
  dbh = sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>db_name<span style="color: black;">&#41;</span>
  reader = <span style="color: #dc143c;">csv</span>.<span style="color: black;">reader</span><span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;import.csv&quot;</span>, <span style="color: #483d8b;">&quot;rb&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> reader:
    ph = <span style="color: #483d8b;">&quot;?,&quot;</span> <span style="color: #66cc66;">*</span> <span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#41;</span> - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;?&quot;</span>
    dbh.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;INSERT INTO %(table_name)s VALUES(%(ph)s)&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">locals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">tuple</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
  dbh.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  dbh.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>これでSQLiteとCSVが相互に行き来できるようになりましたね。ま、最初からMySQL/PostgreSQLを使えよというのが最もかもですが。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/database/1016/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ALTER TABLEが結構便利</title>
		<link>http://taichino.com/engineer-life/database/257</link>
		<comments>http://taichino.com/engineer-life/database/257#comments</comments>
		<pubDate>Mon, 13 Apr 2009 15:36:50 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=257</guid>
		<description><![CDATA[DBのテーブル作成にはもっぱらMySQL Workbenchを利用しています。ところが最初にテーブルを作るときは便利だけど、変更加えようとしたら、結構な頻度でエラーが発生してテーブルの定義を変更できなくなります。 最近頻繁にDBを弄っているのでイライラが募りまして、ALTER TABLEを覚えました。行の追加くらいしかした事が無かったのですが、結構色々できて便利です。 以下はMySQL限定です。他のDBは試していません。 SERIALの値をリセット 基本的にテーブルにはauto incrementでidを作るのですが、 このidに採番される値をリセットしたい事がよくあります。今までは一度テーブルを削除して作成し直していたのですが、ALTER TABLEで行えます。 ALTER TABLE &#40;テーブル名&#41; AUTO_INCREMENT=1 行の順番を変更 ALTER TABLEで行を追加したは良いものの、列の順番が気持ち悪くて入れ替えたい事がよくあります。今まではレコードダンプを取ってテーブルに入れ直していましたが、これもALTER TABLEで行えます。 ALTER TABLE &#40;テーブル名&#41; MODIFY COLUMN &#40;カラム名&#41; &#40;カラム型&#41; AFTER &#40;移動先カラム名&#41; また、そもそも行を追加するときに追加する位置を指定できます。 ALTER TABLE &#40;テーブル名&#41; ADD COLUMN &#40;カラム名&#41; &#40;カラム型&#41; AFTER &#40;追加先カラム名&#41; カラムの名前と型を変更 僕はよくカラム名を変更したくなるのですが、これもALTER TABLEで行けます。 ALTER TABLE &#40;テーブル名&#41; CHANGE &#40;カラム名&#41; &#40;新しいカラム名&#41; &#40;新しいカラム型&#41; ただし型を変えない時も、カラムの型を指定する必要があります。 データベースエンジンの変更 WEBアプリとかをモックから徐々に作っていく過程でMyISAMからINNODBに変更したいシーンが時たまありますが、コレもALTER TABLEで行けます。逆も行けます。 ATLER TABLE &#40;テーブル名&#41; ENGINE=INNODB [...]]]></description>
			<content:encoded><![CDATA[<p>DBのテーブル作成にはもっぱらMySQL Workbenchを利用しています。ところが最初にテーブルを作るときは便利だけど、変更加えようとしたら、結構な頻度でエラーが発生してテーブルの定義を変更できなくなります。</p>
<p><span id="more-257"></span></p>
<p>最近頻繁にDBを弄っているのでイライラが募りまして、ALTER TABLEを覚えました。行の追加くらいしかした事が無かったのですが、結構色々できて便利です。</p>
<p>以下はMySQL限定です。他のDBは試していません。</p>
<ol>
<li><strong> SERIALの値をリセット</strong><br />
基本的にテーブルにはauto incrementでidを作るのですが、<br />
このidに採番される値をリセットしたい事がよくあります。今までは一度テーブルを削除して作成し直していたのですが、ALTER TABLEで行えます。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#40;</span>テーブル名<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span></pre></div></div>

</li>
<li> <strong>行の順番を変更<br />
</strong> ALTER TABLEで行を追加したは良いものの、列の順番が気持ち悪くて入れ替えたい事がよくあります。今まではレコードダンプを取ってテーブルに入れ直していましたが、これもALTER TABLEで行えます。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#40;</span>テーブル名<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">MODIFY</span> <span style="color: #993333; font-weight: bold;">COLUMN</span> <span style="color: #66cc66;">&#40;</span>カラム名<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>カラム型<span style="color: #66cc66;">&#41;</span> AFTER <span style="color: #66cc66;">&#40;</span>移動先カラム名<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>また、そもそも行を追加するときに追加する位置を指定できます。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#40;</span>テーブル名<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ADD</span> <span style="color: #993333; font-weight: bold;">COLUMN</span> <span style="color: #66cc66;">&#40;</span>カラム名<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>カラム型<span style="color: #66cc66;">&#41;</span> AFTER <span style="color: #66cc66;">&#40;</span>追加先カラム名<span style="color: #66cc66;">&#41;</span></pre></div></div>

</li>
<li> <strong>カラムの名前と型を変更</strong><br />
僕はよくカラム名を変更したくなるのですが、これもALTER TABLEで行けます。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#40;</span>テーブル名<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">CHANGE</span> <span style="color: #66cc66;">&#40;</span>カラム名<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>新しいカラム名<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>新しいカラム型<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>ただし型を変えない時も、カラムの型を指定する必要があります。</li>
<li> <strong>データベースエンジンの変更</strong><br />
WEBアプリとかをモックから徐々に作っていく過程でMyISAMからINNODBに変更したいシーンが時たまありますが、コレもALTER TABLEで行けます。逆も行けます。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">ATLER <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#40;</span>テーブル名<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>INNODB</pre></div></div>

</li>
<li><strong>テーブル名の変更</strong><br />
複数形のs付け忘れた時等に重宝します。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#40;</span>テーブル名<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">RENAME</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #66cc66;">&#40;</span>新しいテーブル名<span style="color: #66cc66;">&#41;</span></pre></div></div>

</li>
<li><strong>主キーの変更</strong><br />
主キーの追加も可能</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#40;</span>テーブル名<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ADD</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>カラム名<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>もちろん削除も可能</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#40;</span>テーブル名<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>;</pre></div></div>

</li>
</ol>
<ul>
<li>
<strong>特定のテーブルのカラム定義を取得</strong><br />
ALTER TABLE関係ないんですが、テーブルの定義を見るときに今まではshow column from (テーブル名) とかやってたんですが、desc (テーブル名)で同じ働きでした。タイプ数が結構減りましたね。
</li>
</ul>
<p>てか<a href="http://wordpress.org/extend/plugins/wp-syntax/other_notes/">WP-Syntax</a>ってSQLも対応してるんや。凄いな。</p>
<p><strong>追記  2009.11.26</strong><br />
テーブル名の変更を加えました。</p>
<p><strong>追記 2011.6.9</strong><br />
主キーの項目を追加しました</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/database/257/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

